python - 在numpy数组中按值选择性删除
问题描述
编辑:完善的问题陈述
我仍在研究 numpy 库提供的精美选项。我的办公桌上出现了以下主题:
目的: 在多维数组中,我选择一列。这种切片效果很好。但在那之后,存储在另一个列表中的值需要从列值中过滤掉。
当前状态:
array1 = np.asarray([[0,1,2],[1,0,3],[2,3,0]])
print(array1)
array1woZero = np.nonzero(array1)
print(array1woZero)
toBeRemoved = []
toBeRemoved.append(1)
print(toBeRemoved)
column = array1[:,1]
result = np.delete(column,toBeRemoved)
上面提到的代码并没有带来预期的结果。事实上, np.delete() 命令只是删除索引 1 处的值 - 但我需要过滤掉1 的值。我也不明白将非零应用于array1 时的形状变化:虽然array1 是(3,3),但array1woZero 变成了一个由2 个dim 组成的元组,每个元组有6 个值。
0
Array of int64
(6,)
0
0
1
1
2
2
1
Array of int64
(6,)
1
2
0
2
0
1
我的感觉是,我需要使用排除运算符进行切片。你有什么提示让我解决这个问题吗?有必要使用不同的数据结构吗?
解决方案
In [18]: arr = np.asarray([[0,1,2],[1,0,3],[2,3,0]])
In [19]: arr
Out[19]:
array([[0, 1, 2],
[1, 0, 3],
[2, 3, 0]])
nonzero
arr
给出其参数 ( )的所有非零元素的索引:
In [20]: idx = np.nonzero(arr)
In [21]: idx
Out[21]: (array([0, 0, 1, 1, 2, 2]), array([1, 2, 0, 2, 0, 1]))
这是一个数组元组,每个维度一个。该输出可能会令人困惑,但它很容易用于返回所有这些非零元素:
In [22]: arr[idx]
Out[22]: array([1, 2, 1, 3, 2, 3])
像这样使用一对数组进行索引会产生一个一维数组。在您的示例中,每行只有一个 0,但通常情况并非如此。
这是相同的索引 - 具有相同长度的 2 个列表:
In [24]: arr[[0,0,1,1,2,2], [1,2,0,2,0,1]]
Out[24]: array([1, 2, 1, 3, 2, 3])
idx[0]
只需选择该元组的数组,即行索引。那可能不是你想要的。我怀疑你是否想申请np.delete
那个元组。
很难从描述和代码中看出你想要什么。也许那是因为你不明白nonzero
产生了什么。
我们还可以使用布尔掩码选择非零元素:
In [25]: arr>0
Out[25]:
array([[False, True, True],
[ True, False, True],
[ True, True, False]])
In [26]: arr[ arr>0 ]
Out[26]: array([1, 2, 1, 3, 2, 3])
推荐阅读
- vue.js - nginx 在我的生产 vue-cli 应用程序的页面重新加载时给出 404 错误
- python - Raspberry Pi Zero 和 OpenCV 上的网络摄像头损坏图像
- reactjs - 在 React Hooks 的对象数组中使用 onChange 更新 useState 中的日期(日期选择器)
- c# - C# 如何在生产中调查 OutOfMemoryException
- json - 将数千个 JSON 文件加载到 BigQuery
- python - 在pytest的测试中多次刷新python进程
- java - 使用 SDKMAN 安装的 JDK 在 IntelliJ IDE 中不可选择
- elasticsearch - 如果我可以直接发布到 Elasticsearch,为什么还要使用 Beats?
- algorithm - 联合查找算法伪代码
- c - 使用基本 C 语言输出二维数组