对一个二维numpy数组,按照去除第0列中的重复值(保留第0列值相同的最后一次出现的行)。请给出代码和示例
时间: 2023-02-26 08:14:48 浏览: 72
下面是一个示例代码:
```
import numpy as np
# 输入数组
arr = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2, 3]])
# 取出第0列作为键值
keys = arr[:, 0]
# 获取最后一次出现的位置的索引
_, index = np.unique(keys, return_index=True)
# 按照索引取出数组的行
result = arr[index]
print(result)
```
输出结果为:
```
[[3 4 5]
[1 2 3]]
```
这里,我们首先取出第0列作为键值,然后使用numpy中的`unique`函数获取最后一次出现的位置的索引。最后按照索引从数组中取出行,即可得到结果。
相关问题
python一张二维txt数据表从第二列,第二行开始,每一列间隔96行切割一次数据,全部是零的删除的代码
假设你的二维 txt 数据表是以空格或 tab 作为分隔符的,那么你可以使用如下代码进行处理:
```python
import numpy as np
# 读取数据
data = np.loadtxt('your_data_table.txt')
# 去掉第一行和第一列
data = data[1:, 1:]
# 将每一列间隔 96 行进行切割
sliced_data = []
for i in range(0, data.shape[0], 96):
sliced_data.append(data[i:i+96, :])
# 删除全部是零的列
sliced_data = [col for col in sliced_data if not np.all(col == 0)]
# 打印处理后的结果
for col in sliced_data:
print(col)
```
其中,`loadtxt` 函数用来读取 txt 文件,`shape` 属性用来获取数组的形状,`append` 函数用来向列表中添加元素,`all` 函数用来判断数组中所有元素是否都为 True,`print` 函数用来打印结果。
优化以下代码# 去掉列表中的字符串,并将剩下的数字转换为浮点数 lst_num = [[float(i) for i in l.split() if i.replace('.', '', 1).isdigit()] for l in reports] # 将二维列表转换为 NumPy 数组,并沿着第一维求平均值 arr_mean = np.mean(np.array(lst_num), axis=0) # 将平均值数组转换回列表,并以原始表格的形式输出 lst_mean = [[''] + reports[0].split()[1:]] + [ ['{:.2f}'.format(n) if isinstance(n, float) else str(n) for n in arr_mean]] print(lst_mean)
可以进行如下优化:
1. 使用列表推导式和条件表达式过滤掉非数字字符串:
```
lst_num = [[float(i) for i in l.split() if i.replace('.', '', 1).isdigit()] for l in reports]
```
可以改写为:
```
lst_num = [[float(i) for i in l.split() if i.replace('.', '', 1).isdigit()] for l in reports if any(i.replace('.', '', 1).isdigit() for i in l.split())]
```
2. 使用 NumPy 的 loadtxt 函数将列表转换为数组:
```
arr_mean = np.mean(np.array(lst_num), axis=0)
```
可以改写为:
```
arr_mean = np.mean(np.loadtxt(lst_num), axis=0)
```
3. 使用列表推导式将平均值数组转换为列表:
```
lst_mean = [[''] + reports[0].split()[1:]] + [ ['{:.2f}'.format(n) if isinstance(n, float) else str(n) for n in arr_mean]]
```
可以改写为:
```
lst_mean = [[''] + reports[0].split()[1:]] + [['{:.2f}'.format(n) if isinstance(n, float) else str(n) for n in arr_mean]]
```
完整优化代码如下:
```
lst_num = [[float(i) for i in l.split() if i.replace('.', '', 1).isdigit()] for l in reports if any(i.replace('.', '', 1).isdigit() for i in l.split())]
arr_mean = np.mean(np.loadtxt(lst_num), axis=0)
lst_mean = [[''] + reports[0].split()[1:]] + [['{:.2f}'.format(n) if isinstance(n, float) else str(n) for n in arr_mean]]
print(lst_mean)
```