8 修改数组的元素

6 阅读5分钟

修改元素的方法

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)) 的计算逻辑是按照原数组的元素顺序,循环填充目标形状的新数组,如果原数组元素数量不足,则重复原数组的元素直至填满目标形状。

具体计算步骤:

  1. 原数组 ****a ****的元素:原数组 a2×3 的二维数组,元素按行优先顺序(横向读取)排列为:[1, 1, 1, 2, 2, 2](共 6 个元素)。
  2. 目标形状 ****(5,5) ****的总元素数:目标数组需要 5×5 = 25 个元素。
  3. 循环填充元素:用原数组的元素按顺序循环填充 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. 最终得到的 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]
  2. 重塑为目标形状 (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]))