修改元素的方法
NumPy 有下列几种修改数组元素的方法:
| 方法 | 参数 | 说明 |
|---|---|---|
| numpy.resize() | arr, shape | 改数组列尺寸大小。 |
| numpy.append() | arr, item | 添加元素到数组最后面,返回一个一维数组 |
| numpy.insert() | arr, index, item | 添加元素到数组指定的位置,返回一个一维数组。 |
| numpy.delete() | arr, index | 删除某个元素,返回一个一维数组 |
| numpy.unique() | arr | 取出不重复的元素,返回一个一维数组 |
numpy.resize()
numpy.resize()会将原来的数组调整为新的尺寸,原作原理是先把原本的数组元素摊平,再依次放入到新尺寸的数组中,弱新尺寸大于原来的元素数量,就依次重复放入,如果新尺寸小于原本的数量,就会舍弃超过的元素。
import numpy as np
a = np.array([[1,1,1],[2,2,2]])
b = np.resize(a, (3,2))
print(b)
'''
[[1 1]
[1 2]
[2 2]]
'''
c = np.resize(a, (5,5))
print(c)
'''
[[1 1 1 2 2]
[2 1 1 1 2]
[2 2 1 1 1]
[2 2 2 1 1]
[1 2 2 2 1]]
'''
d = np.resize(a, (2,2))
print(d)
'''
[[1 1]
[1 2]]
np.resize(a, (5,5)) 的计算逻辑是按照原数组的元素顺序,循环填充目标形状的新数组,如果原数组元素数量不足,则重复原数组的元素直至填满目标形状。
具体计算步骤:
- 原数组 ****
a****的元素:原数组a是2×3的二维数组,元素按行优先顺序(横向读取)排列为:[1, 1, 1, 2, 2, 2](共 6 个元素)。 - 目标形状 ****
(5,5)****的总元素数:目标数组需要5×5 = 25个元素。 - 循环填充元素:用原数组的元素按顺序循环填充 25 个位置,不够时从头重复原数组:
-
- 第 1~6 个元素:
[1,1,1,2,2,2](原数组完整元素) - 第 7~12 个元素:
[1,1,1,2,2,2](第 1 次重复) - 第 13~18 个元素:
[1,1,1,2,2,2](第 2 次重复) - 第 19~24 个元素:
[1,1,1,2,2,2](第 3 次重复) - 第 25 个元素:
1(第 4 次重复的第 1 个元素)
- 第 1~6 个元素:
- 最终得到的 25 个元素序列为:
[1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1] - 重塑为目标形状
(5,5):将上述 25 个元素按行优先排列为 5 行 5 列的二维数组,结果如下:
[[1 1 1 2 2]
[2 1 1 1 2]
[2 2 1 1 1]
[2 2 2 1 1]
[1 2 2 2 1]]
关键规律:
np.resize不考虑原数组的维度,仅按扁平后的元素顺序循环填充。- 若目标形状的总元素数 小于 原数组元素数,则截断原数组(保留前 N 个元素)。
- 若目标形状的总元素数 大于 原数组元素数,则重复原数组元素直至填满。
对比 np.reshape(仅改变形状,不增删元素),np.resize 的核心是通过重复 / 截断元素来适配目标形状。
numpy.append()
numpy.append()h 会将元素添加到数组最后,并返回一个一维数组,第一个参数为 arr 原本的数组,第二个参数为要添加的内容
import numpy as np
a = np.array([[1,1,1],[2,2,2]])
b = np.append(a, 1)
c = np.append(a, [3,3,3])
print(b) # [1 1 1 2 2 2 1]
print(c) # [1 1 1 2 2 2 3 3 3]
如果加入的元素数量和原本的数组相同,可以设定第三个参数(默认值是 None)0 是行、1 是列,指定插入的维度
import numpy as np
a = np.array([[1,1,1],[2,2,2]])
b = np.append(a, [[3,3,3],[4,4,4]],1)
print(b)
'''
[[1 1 1 3 3 3]
[2 2 2 4 4 4]]
'''
c = np.append(a, [[3,3,3],[4,4,4]],0)
print(c)
'''
[[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]]
'''
numpy.insert()
numpy.insert()会将元素添加到数组指定的位置,并返回一个一维数组,第一个参数为 arr 原本的数组,第二个参数为加入的位置,第三个参数是要加入的内容,如果设定为第四个参数(默认值是 none)为 0(行)或 1(列),则可以指定元素插入的维度
import numpy as np
a = np.array([[1,1],[2,2],[3,3]])
b = np.insert(a, 1, [4,4])
c = np.insert(a, 2, [4,4])
print(b) # [1 4 4 1 2 2 3 3]
print(c) # [1 1 4 4 2 2 3 3]
d = np.insert(a, 2, [4,4], 0)
print(d)
'''
[[1 1]
[2 2]
[4 4]
[3 3]]
'''
numpy.delete()
numpy.delete()会将元素从指定维度删除,返回一个一维数组,第一个参数为 arr 原本的数组,第二个参数为要删除元素的位置,如果设定第三个参数(默认值为 None)为 0(行)或 1(列),则可以指定元素插入的维度
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
b = np.delete(a, 1)
c = np.delete(a, 2)
print(b) # [1 3 4 5 6]
print(c) # [1 2 4 5 6]
d = np.delete(a, 2, 0)
print(d)
'''
[[1 2]
[3 4]]
'''
numpy.unique()
该函数用于找出数组中不重复的唯一值,并通过参数控制返回额外信息(索引、逆映射、计数)
| 参数 | 作用 |
|---|---|
arr | 输入数组(必填) |
return_index | 布尔值,默认 False;为 True时,返回唯一值在原展平数组中的首次出现索引 |
return_inverse | 布尔值,默认 False;为 True 时,返回原展平数组中每个元素对应唯一值的索引(逆映射) |
return_counts | 布尔值,默认 False;为 True 时,返回每个唯一值在原数组中的出现次数 |
import numpy as np
a = np.array([[1,1],[2,2],[3,3]])
b = np.unique(a)
c = np.unique(a, return_index=True)
d = np.unique(a, return_inverse=True)
e = np.unique(a, return_counts=True)
print(b) # [1 2 3]
print(c) # (array([1, 2, 3]), array([0, 2, 4]))
print(d) # (array([1, 2, 3]), array([0, 0, 1, 1, 2, 2]))
print(e) # (array([1, 2, 3]), array([2, 2, 2]))