python - NumPy:从二维数组中索引一个元素
问题描述
我有以下 8 x 8 数组命名arr
:
[[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]
[False False False False False False False False]]
我想将它的特定元素设置为True
,为此我有这个filtered_ind
数组:
[[5 6]
[4 5]
[2 5]
[1 6]]
尝试这样做:
arr[filtered_ind] = True
结果如下:
[[False False False False False False False False]
[ True True True True True True True True]
[ True True True True True True True True]
[False False False False False False False True]
[ True True True True True True True True]
[ True True True True True True True True]
[ True True True True True True True True]
[False False False False False False False False]]
基本上,它获取filtered_ind
数组中的每个数字,并将这些行设置为True
,而不是设置特定元素。
我发现索引不像我认为的那样工作,因为print(arr[filtered_ind])
给了我这个:
[[[False False False False False False False False]
[False False False False False False False False]]
[[False False False False False False False False]
[False False False False False False False False]]
[[False False False False False False False False]
[False False False False False False False False]]
[[False False False False False False False False]
[False False False False False False False False]]]
而不是我所期望的,这[False False False False]
当然是。
我该如何解决这个问题,更重要的是,为什么会这样?
解决方案
您只是沿第一个轴进行索引。你需要:
a = np.full((8,8), False)
ix = np.array([[5, 6],[4, 5],[2, 5],[1, 6]])
a[ix[:,0], ix[:,1]] = True
或者我们也可以np.add.at
在这里使用:
np.add.at(a,tuple(zip(*ix)),True)
print(a)
[[False False False False False False False False]
[False False False False False False True False]
[False False False False False True False False]
[False False False False False False False False]
[False False False False False True False False]
[False False False False False False True False]
[False False False False False False False False]
[False False False False False False False False]]
请记住,通过按原样编制索引a[ix]
,您仅在第一个轴上编制索引。通过一个更简单的示例,您会更清楚地看到:
ix = np.array([[1,2],[0,3],[2,2]])
a = np.arange(0,16).reshape(4,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
现在,如果你沿着第一个轴索引,就像你做的那样,你会得到:
a[ix]
array([[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 8, 9, 10, 11],
[ 8, 9, 10, 11]]])
基本上与索引中的值一样多的行,具有索引数组的形状。您还必须指定要索引的列(第二个轴),例如在第一种方法中,[ix[:,0]
沿第一个轴和ix[:,1]
沿第二个轴:
a[ix[:,0], ix[:,1]] = True
推荐阅读
- python - python、POO、tkinter 的问题和保存问题
- javascript - 带有 HTML 输入的 Js if 语句
- python - 回归预测大于实际值
- android - 如何在android Q+中永久存储数据
- python - Tkinter - TreeView 小部件中的自定义项目
- javascript - 如何更改类中每个元素的颜色
- javascript - 链接两个 JavaScript 文件以在 HTML 页面上协同工作
- jquery - jQuery触发器('click')不会去href位置
- javascript - 通过Javascript在某个div中按类名获取元素
- python - 将标签的特殊单词加粗