按numpy数组中的值选择性删除
Selective deletion by value in numpy array
已编辑:改进的问题陈述
我仍在研究 numpy 库提供的精美选项。我桌上出现了以下主题:
用途:
在多维数组中我 select 一列。这种切片效果很好。但在那之后,存储在另一个列表中的值需要从列值中过滤掉。
当前状态:
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 个 dims 的元组,每个 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]))
这是一个数组元组,每个维度一个。该输出可能令人困惑,但它很容易用于 return 所有这些非零元素:
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]
只是 select 那个元组的数组,行索引。那可能不是你想要的。我怀疑你是否想将 np.delete
应用于那个元组。
很难从描述和代码中判断出您想要什么。也许那是因为你不明白 nonzero
正在产生什么。
我们还可以 select 具有布尔掩码的非零元素:
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])
布尔掩码的提示非常好,帮助我开发了自己的解决方案。以下代码片段中的符号名称不同,但无论如何思路应该清晰了。
一开始,我有我的整体搜索空间。
searchSpace = relativeDistances[currentNode,:]
假设它的形状是(5,)。我的过滤器是在索引上定义的,即范围 0..4。然后我定义了另一个 numpy 数组"filter",形状相同,全为 1,要过滤掉的值我设置为 0.
filter = np.full(shape=nodeCount,fill_value=1,dtype=np.int32())
filter[0] = 0
filter[3] = 0
searchSpace = searchSpace * filter
minValue = searchSpace[searchSpace > 0].min()
neighborNode = np.where(searchSpace==minValue)
过滤器数组让我可以灵活地在以后作为循环的一部分调整过滤器。使用与 0 的逐元素乘法和后续的布尔掩码,我可以为最小搜索创建减少的搜索空间。与单独的数组或列表相比,我仍然具有原始形状,需要在 where 语句中获取正确的索引。
已编辑:改进的问题陈述
我仍在研究 numpy 库提供的精美选项。我桌上出现了以下主题:
用途: 在多维数组中我 select 一列。这种切片效果很好。但在那之后,存储在另一个列表中的值需要从列值中过滤掉。
当前状态:
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 个 dims 的元组,每个 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]))
这是一个数组元组,每个维度一个。该输出可能令人困惑,但它很容易用于 return 所有这些非零元素:
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]
只是 select 那个元组的数组,行索引。那可能不是你想要的。我怀疑你是否想将 np.delete
应用于那个元组。
很难从描述和代码中判断出您想要什么。也许那是因为你不明白 nonzero
正在产生什么。
我们还可以 select 具有布尔掩码的非零元素:
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])
布尔掩码的提示非常好,帮助我开发了自己的解决方案。以下代码片段中的符号名称不同,但无论如何思路应该清晰了。
一开始,我有我的整体搜索空间。
searchSpace = relativeDistances[currentNode,:]
假设它的形状是(5,)。我的过滤器是在索引上定义的,即范围 0..4。然后我定义了另一个 numpy 数组"filter",形状相同,全为 1,要过滤掉的值我设置为 0.
filter = np.full(shape=nodeCount,fill_value=1,dtype=np.int32())
filter[0] = 0
filter[3] = 0
searchSpace = searchSpace * filter
minValue = searchSpace[searchSpace > 0].min()
neighborNode = np.where(searchSpace==minValue)
过滤器数组让我可以灵活地在以后作为循环的一部分调整过滤器。使用与 0 的逐元素乘法和后续的布尔掩码,我可以为最小搜索创建减少的搜索空间。与单独的数组或列表相比,我仍然具有原始形状,需要在 where 语句中获取正确的索引。