python - 使用布尔数组在 numpy 中对二维数组进行索引
问题描述
我使用布尔索引从 numpy 数组中选择元素作为
x = y[t<tmax]
其中 ta numpy 数组具有与 y 一样多的元素。我的问题是如何对 2D numpy 数组做同样的事情?我试过了
x = y[t<tmax][t<tmax]
但是,这似乎不起作用,因为它似乎首先选择了行,然后抱怨第二个选择的维度错误。
IndexError: boolean index did not match indexed array along dimension 0; dimension is 50 but corresponding boolean dimension is 200
#
这是一个例子
x1D = np.array([1,2,3], np.int32)
x2D = np.array([[1,2,3],[1,2,3],[1,2,3]], np.int32)
print(x1D[x1D<3]) --> [1 2]
print(x2D[x1D<3][x1D<3]) --> error
第二个 print 语句产生与上面显示的错误类似的错误。我用
print(x2D[x1D<3])
我明白了
[[1 2 3]
[1 2 3]]
但我想要
[[1 2]
[1 2]]
解决方案
In [28]: x1D = np.array([1,2,3], np.int32)
...: x2D = np.array([[1,2,3],[1,2,3],[1,2,3]], np.int32)
一维面具:
In [29]: x1D<3
Out[29]: array([ True, True, False])
应用于一维数组(相同大小):
In [30]: x1D[_]
Out[30]: array([1, 2], dtype=int32)
应用于 2d 它选择 2 行:
In [31]: x2D[_29]
Out[31]:
array([[1, 2, 3],
[1, 2, 3]], dtype=int32)
它可以再次用于选择列 - 但请注意:
行索引的占位符:
In [32]: _[:, _29]
Out[32]:
array([[1, 2],
[1, 2]], dtype=int32)
如果我们从该掩码生成一个索引数组,我们可以一步完成索引:
In [37]: idx = np.nonzero(x1D<3)
In [38]: idx
Out[38]: (array([0, 1]),)
In [39]: x2D[idx[0][:,None], idx[0]]
Out[39]:
array([[1, 2],
[1, 2]], dtype=int32)
编写此“2d”索引的另一种方法:
In [41]: x2D[ [[0],[1]], [[0,1]] ]
Out[41]:
array([[1, 2],
[1, 2]], dtype=int32)
ix_
是调整索引维度的便捷工具:
In [42]: x2D[np.ix_(idx[0], idx[0])]
Out[42]:
array([[1, 2],
[1, 2]], dtype=int32)
或将布尔掩码传递给ix_
:
In [44]: np.ix_(_29, _29)
Out[44]:
(array([[0],
[1]]), array([[0, 1]]))
In [45]: x2D[np.ix_(_29, _29)]
Out[45]:
array([[1, 2],
[1, 2]], dtype=int32)
写In[32]
它接近你的尝试:
In [46]: x2D[x1D<3][:, x1D<3]
Out[46]:
array([[1, 2],
[1, 2]], dtype=int32)
推荐阅读
- perl - Perl中基于分隔符动态改变键值
- android - 根据抽屉项目的导航抽屉标题
- c++ - Visual Studio C++ 项目和引用项目的参考
- modelica - 使用点符号和字符串从 Modelica 中的数组加载记录
- python - OSMNX Shortest path Nodes - 获取节点经过的时间
- raspberry-pi - How to install Bcrypt on a 64bit Raspberry PI?
- android - Android Studio 4.0 error; Cause: invalid type code: 3A
- python - Python Script POST Body Containing CRLF Characters and Malformed Headers. HTTP Request Smuggling
- python - Taking a list as input from user
- c++ - (Why) can we assign non-static class members to static variables in initialization?