Python 2D NumPy 数组理解
Posted
技术标签:
【中文标题】Python 2D NumPy 数组理解【英文标题】:Python 2D NumPy array comprehension 【发布时间】:2015-08-13 16:24:36 【问题描述】:我是 NumPy 的新手。我有一个包含浮点值的二维 NumPy 数组。我希望在整个矩阵中获得大于某个值的 70% 的那些元素的索引,比如 t 。
output = [(1,2),(4,7),(7,1)]
表示 arr[1][2]、arr[4][7] 和 arr[7][1] 的值大于 70 t
使用 2 个循环来完成工作是一种相当简单的方法。完成它的最 Pythonic 方式是什么(列表理解等)?请指出任何重复项。谢谢!
【问题讨论】:
Numpy 的where 在这里听起来很相关,看看吧。 给出该示例案例的其余部分,包括您的循环。顺便说一句,对于numpy
,我们通常索引:arr[1,2]
,而不是arr[1][2]
。
@hpaulj 抱歉,没明白你的意思。样例如 ?我只有一个想要遍历的二维数组。
注意:通常,计算实际索引是不必要的开销。我在这里看到的大多数对where
的调用都可以简单地删除而不会影响程序的行为,并且代码会运行得更快。
【参考方案1】:
一个例子:
In [76]: arr=np.arange(20, dtype=float).reshape(4,5)
In [77]: arr
Out[77]:
array([[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[ 10., 11., 12., 13., 14.],
[ 15., 16., 17., 18., 19.]])
可以从数组中选择值的布尔索引
In [79]: arr>15
Out[79]:
array([[False, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False],
[False, True, True, True, True]], dtype=bool)
In [80]: arr[arr>15]
Out[80]: array([ 16., 17., 18., 19.])
条件为真的索引,也可以用来选择元素
In [81]: I=np.nonzero(arr>15)
In [82]: I
Out[82]: (array([3, 3, 3, 3], dtype=int32), array([1, 2, 3, 4], dtype=int32))
In [83]: arr[I]
Out[83]: array([ 16., 17., 18., 19.])
或者将索引元组变成对列表
In [84]: list(zip(*I))
Out[84]: [(3, 1), (3, 2), (3, 3), (3, 4)]
In [87]: [arr[j] for j in zip(*I)]
Out[87]: [16.0, 17.0, 18.0, 19.0]
【讨论】:
以上是关于Python 2D NumPy 数组理解的主要内容,如果未能解决你的问题,请参考以下文章
Python之NumPy(axis=0/1/2...)的透彻理解
python使用numpy中的diagonal函数获取2D numpy数组的对角线元素使用numpy中的diagonal函数和sum函数获取2D numpy数组的迹(matrix trace)