一、用于布尔型数组的方法

布尔值在进行数学统计方法时会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔型数组中的True值进行计数。

1
2
3
4
5
6
import numpy as np
arr = np.random.randon(100)
print((arr > 0).sum())

# 结果
print(56) # 因为arr是随机生成的符合正态分布的数据,因此该结果不一定相同

anyall方法对布尔型数组非常有用。any用于测试数组中是否存在一个或多个True,而all则检查数组中所有值是否都是True:

1
2
3
4
5
6
7
8
···
bools = np.array([False, True, True, False])
print(bools.any())
print(bools.all())

# 结果
True
False

这两个方法也能用于非布尔型数组,所有非0元素将会被当做True

二、排序

2.1 一维数组

Numpy数组也可以通过sort方法进行就地(inplace)排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
arr = np.random.randn(6)
print("-----arr-----")
print(arr)
print("-----arr.sort()----")
arr.sort()
print(arr)

# 结果
----arr----
[-0.44877877 0.48207511 -0.70813612 -1.47470048 -0.48642976 -1.36405692]
----arr.sort()----
[-1.47470048 -1.36405692 -0.70813612 -0.48642976 -0.44877877 0.48207511]

2.2 多维数组

多维数组可以在任意一个轴上进行排序,只需要将轴编号传递给sort即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
arr = np.random.randon(5, 3)
print('----arr----')
print(arr)
print('----arr.sort(1)----')
arr.sort(1)
print(arr)

# 结果
----arr-----
[[-1.16948324 -0.30273131 -0.93708784] #横着的是1轴
[ 0.61541511 0.99204474 1.27347233]
[-0.86614243 1.08452133 0.36962142]
[ 0.15675404 0.589467 -0.04253482]
[-0.12645503 1.07969955 -1.71821312]]
-----arr.sort(1)----
[[-1.16948324 -0.93708784 -0.30273131]
[ 0.61541511 0.99204474 1.27347233]
[-0.86614243 0.36962142 1.08452133]
[-0.04253482 0.15675404 0.589467 ]
[-1.71821312 -0.12645503 1.07969955]]

顶级方法np.sort返回的是数组的已排序副本,而不是inplace操作。计算数组分位数做简单的方法是对其进行排序,然后选取特定位置的值:

1
2
3
4
5
6
7
import numpy as np
large_arr = np.random.randn(1000)
large_arr.sort()
print(large_arr[int(0.05 * len(large_arr))])

# 结果
-1.6379662816801295

三、唯一化以及其他的集合逻辑

NumPy提供了一些针对一维ndarray的基本集合运算。最常用的可能要数np.unique了,它用于找出数组中的唯一值并返回已排序的结果:

1
2
3
4
5
6
7
8
9
import numpy as np
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print(np.unique(names))
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
print(np.unique(ints))

# 结果
['Bob' 'Joe' 'Will']
[1 2 3 4]

函数np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组:

1
2
3
4
5
6
···
values = np.array([6, 0, 0, 3, 2, 5, 6])
print(np.in1d(values, [2,3,6]))

# 结果
[ True False False True True False True]