numpy数组操作

In [1]:
import numpy as np

1.修改数组形状

resize()

np.ndarray.resize( shape ) 修改原数组的大小
np.resize( arr, shape ) 返回一个新的数组

In [2]:
a = np.ones(shape=(2,2), dtype=int)
print(a)
a.resize(4,4)
print(a)
[[1 1]
 [1 1]]
[[1 1 1 1]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
In [3]:
a.resize(3,3)
print(a)
[[1 1 1]
 [1 0 0]
 [0 0 0]]

reshape()

返回一个新数组,不会改变原来的数组

In [4]:
a = np.arange(12)
print(a)
print('a.shape = ', a.shape)
for x in a: print(x,end = ' ')
print()
[ 0  1  2  3  4  5  6  7  8  9 10 11]
a.shape =  (12,)
0 1 2 3 4 5 6 7 8 9 10 11 
In [5]:
b = a.reshape(3,4) # 返回一个新数组
print('a.shape = ', a.shape)
print(b)
print('b.shape = ', b.shape)
for x in b: print(x)
a.shape =  (12,)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b.shape =  (3, 4)
[0 1 2 3]
[4 5 6 7]
[ 8  9 10 11]

ndarray.flat

flat属性可用于迭代其对应的ndarray, 但无法对元素进行修改

In [6]:
# 以行序逐元素访问
print(b.flat)
for x in b.flat:
    print(x, end=' ')
    x = x*2  # 该修改对原数组无效
print()
print(b)
<numpy.flatiter object at 0x00000000005150C0>
0 1 2 3 4 5 6 7 8 9 10 11 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

ndarray.flatten()

返回一份数组拷贝,对拷贝所做的修改不会影响原始数组, 返回的数组是一维的

In [7]:
print(b.flatten() ) # 返回展开成一维的数组, 默认以行序展开
print(b.flatten(order = 'F')) # 以列序展开
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[ 0  4  8  1  5  9  2  6 10  3  7 11]

2.连接数组

np.concatenate()

用于沿指定轴连接相同形状的两个或多个数组,格式如下:
numpy.concatenate( (a1, a2, ...), axis)

In [8]:
a = np.arange(1,5).reshape(2,2)
b = np.arange(5,9).reshape(2,2)
print(a)
print()
print(b)
[[1 2]
 [3 4]]

[[5 6]
 [7 8]]
In [9]:
print( np.concatenate( (a,b), axis=0) )  # b 连接到a的下面
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
In [10]:
print( np.concatenate( (a,b), axis=1) ) # b 连接到 a的右边
[[1 2 5 6]
 [3 4 7 8]]

np.hstack(), np.vstack() 有类似的作用

In [11]:
print(np.hstack( (a,b) ) )   # 水平方向堆叠
[[1 2 5 6]
 [3 4 7 8]]
In [12]:
print(np.vstack( (a,b) ) )  # 垂直方向堆叠
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

3.分割数组

np.split()

In [13]:
a = np.arange(12)
print(np.split(a, 2)) # 将a分成两个子数组
for x in np.split(a, 2):
    print(x)
[array([0, 1, 2, 3, 4, 5]), array([ 6,  7,  8,  9, 10, 11])]
[0 1 2 3 4 5]
[ 6  7  8  9 10 11]
In [14]:
print(np.split(a, [3,6,9]))  # 从指定位置拆分
for x in np.split(a, [3,6,9]):
    print(x)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]
[0 1 2]
[3 4 5]
[6 7 8]
[ 9 10 11]
In [17]:
b = np.array( np.split(a, 3) )
print(b)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

4. 附加元素

append()

numpy.append(arr, values, axis=None), 返回一个新数组

In [30]:
a = np.arange(1,7).reshape(2,3)
print(a)
[[1 2 3]
 [4 5 6]]
In [35]:
# 默认情况下, 会将两个参数都展开成一维的, 然后连接起来
print(np.append(a, [0,0] ) )     
print(np.append(a, [[0,1],[2,3]] ) )  
[1 2 3 4 5 6 0 0]
[1 2 3 4 5 6 0 1 2 3]
In [38]:
# 如果指定了 axis 参数, 则以axis指定的方向连接前两个参数
print(np.append(a, [[7,8,9]], axis=0))
[[1 2 3]
 [4 5 6]
 [7 8 9]]
In [40]:
print(np.append(a, [[0,1],[2,3]], axis=1))
[[1 2 3 0 1]
 [4 5 6 2 3]]

5.插入元素

np.insert(arr, obj, values, axis)

In [42]:
a = np.arange(1, 7).reshape(2,3)
print(a)
[[1 2 3]
 [4 5 6]]
In [70]:
# 默认情况下, 会将待插入的数组和要插入的数组展开, 然后再插入到指定位置
print(np.insert(a, 2, [0,0,0] ))
print(np.insert(a, 2, 0))
# print(np.insert(a, 2, [[0,0,0]] )) #error
[1 2 0 0 0 3 4 5 6]
[1 2 0 3 4 5 6]
In [71]:
# 如果指定了 axis参数, 则会在指定方向上进行插入
print(np.insert(a, 1, [0,0,0], axis=0)) 
# 注意参数是一列一列插进去的, 而不是作为一个整体一次性插入的
print(np.insert(a, 1, [[0,0],[-1,-1]], axis=1)) 
[[1 2 3]
 [0 0 0]
 [4 5 6]]
[[ 1  0 -1  2  3]
 [ 4  0 -1  5  6]]
In [74]:
# 如果插入的是单个数字,并且指定了 axis参数, 则会在axis指定的方向上进行广播操作
print(np.insert(a, 1, 0, axis=0)) # 在 index=1的行上广播
print(np.insert(a, 1, 0, axis=1)) # 在 index=1的列上广播
[[1 2 3]
 [0 0 0]
 [4 5 6]]
[[1 0 2 3]
 [4 0 5 6]]

6.删除元素

np.delete(arr, obj, axis)

In [80]:
a = np.arange(1,13).reshape(3,4)
print(a)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
In [83]:
# 删除对应下标的一个或多个元素
print(np.delete(a, 1))
print(np.delete(a, [2,5,7]))
[ 1  3  4  5  6  7  8  9 10 11 12]
[ 1  2  4  5  7  9 10 11 12]
In [85]:
print(np.delete(a, 1, axis=0))  # 删除下标为1的行
[[ 1  2  3  4]
 [ 9 10 11 12]]
In [87]:
print(np.delete(a, [0,2], axis=1)) # 删除下标为0,2的列
[[ 2  4]
 [ 6  8]
 [10 12]]

7.元素去重

np.unique(arr, return_index, return_inverse, return_counts)
arr如果不是一维的, 会自动展成一维数组, 并且对数组进行排序

In [93]:
a = np.array([[6,5,5,3,3,2,1], [2,3,4,7,7,6,1] ])
print(a)
[[6 5 5 3 3 2 1]
 [2 3 4 7 7 6 1]]
In [94]:
print(np.unique(a))
[1 2 3 4 5 6 7]
In [95]:
b, idx = np.unique(a, return_index=True)
print(b)
print(idx) # 个元素在原数组(展开后)中首次出现的下标
[1 2 3 4 5 6 7]
[ 6  5  3  9  1  0 10]
In [96]:
b,cnt = np.unique(a, return_counts=True)
print(b)
print(cnt)  #各元素在原数组中出现的次数
[1 2 3 4 5 6 7]
[2 2 3 1 2 2 2]
In [101]:
b, inv = np.unique(a, return_inverse=True)
print(b)
print(inv)    # 原数组中各元素是b中的那一个(下标)的元素
print(b[inv]) # 用去重数组和原数组元素在新数组中的索引重构出原数组
[1 2 3 4 5 6 7]
[5 4 4 2 2 1 0 1 2 3 6 6 5 0]
[6 5 5 3 3 2 1 2 3 4 7 7 6 1]