2020年7月10日 / 91次阅读 / Last Modified 2020年7月10日
NumPy
ndarray与条件判断结合,可以很方便的将符合条件的数据取出来。
>>> a = np.arange(10).reshape(2,5)
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> a[a<6]
array([0, 1, 2, 3, 4, 5])
>>> a[a<7]
array([0, 1, 2, 3, 4, 5, 6])
a的ndim是2,用条件判断取出来的新的ndarray,ndim是1.
如果用ndarray直接做条件判断,会得到一个全是True和False的shape一样的ndarray:
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> a>3
array([[False, False, False, False, True],
[ True, True, True, True, True]])
>>> a>5
array([[False, False, False, False, False],
[False, True, True, True, True]])
>>> a>7
array([[False, False, False, False, False],
[False, False, False, True, True]])
很有趣吧。。因为对ndarray的操作是elementwise的。
如果再配合上np.nonzero函数,就可以把符合我们条件的数据的位置找出来。比如这个找出所有大于6的数据的位置:
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> b = (a>6)
>>> b
array([[False, False, False, False, False],
[False, False, True, True, True]])
>>> c = np.nonzero(b)
>>> c
(array([1, 1, 1], dtype=int64), array([2, 3, 4], dtype=int64))
>>> for x,y in zip(c[0],c[1]):
... print(x,y)
...
1 2
1 3
1 4
>>> a[1,2]
7
>>> a[1,3]
8
>>> a[1,4]
9
c[0]和c[1]对应起来就是位置。
下面再试一个3D的ndarray,找出所有大于6并小于16的数据位置:
>>> a = np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> a.shape
(2, 3, 4)
>>> b = (a>6)&(a<16)
>>> b
array([[[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]],
[[ True, True, True, True],
[False, False, False, False],
[False, False, False, False]]])
>>> c = np.nonzero(b)
>>> c
(array([0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=int64), array([1, 2, 2, 2, 2, 0, 0, 0,
0], dtype=int64), array([3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
>>> for x,y,z in zip(c[0],c[1],c[2]):
... print(x,y,z)
...
0 1 3
0 2 0
0 2 1
0 2 2
0 2 3
1 0 0
1 0 1
1 0 2
1 0 3
>>> a[0,1,3]
7
>>> a[0,2,0]
8
>>> a[0,2,1]
9
>>> a[1,0,2]
14
>>> a[1,0,3]
15
-- EOF --
本文链接:https://www.pynote.net/archives/2226
前一篇:用openpyxl遍历表格的行列
后一篇:用openpyxl.styles设置格式
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记