问题
报错:AttributeError: 'numpy.ndarray' object has no attribute 'append'
解决
列表中用 append 直接添加元素,但是 numpy 数组需要使用 numpy.append(arr,values,axis=None)
其中有两点需要注意,举例说明:
目标:在下面的数组中增加一行 「255, 255, 255】
[[100 88 77]
[126 123 116]
[ 31 27 23]
[181 174 163]
[219 213 210]]
代码:
import numpy as np
lst =[[100, 88, 77],
[126, 123, 116],
[31, 27, 23],
[181, 174, 163],
[219, 213, 210]]
value2append = [255, 255, 255]
print(f"lst:\n{lst}")
print()
lst2array = np.array(lst)
print(f"lst2array:\n{lst2array}")
print()
错误 1
## 错误 1
new_array = np.append(lst2array, value2append)
print(f"new_array:\n{new_array}")
得到的结果是:[100 88 77 126 123 116 31 27 23 181 174 163 219 213 210 255 255 255]
,结果被压缩为一维数组了!
lst:
[[100, 88, 77], [126, 123, 116], [31, 27, 23], [181, 174, 163], [219, 213, 210]]
lst2array:
[[100 88 77]
[126 123 116]
[ 31 27 23]
[181 174 163]
[219 213 210]]
new_array:
[100 88 77 126 123 116 31 27 23 181 174 163 219 213 210 255 255 255]
错误 2
value2append = np.array(value2append).reshape(-1, 3)
print(f"value2append:\n{value2append}")
print()
new_array = np.append(lst2array, value2append)
print(f"new_array:\n{new_array}")
虽然将 待添加的数组改为了与原数组一样的 shape,但是结果依旧有问题:[100 88 77 126 123 116 31 27 23 181 174 163 219 213 210 255 255 255]
正解
## 正解
value2append = np.array(value2append).reshape(-1, 3)
print(f"value2append:\n{value2append}")
print()
new_array = np.append(lst2array, value2append, axis=0)
print(f"new_array:\n{new_array}")
得到结果:
new_array:
[[100 88 77]
[126 123 116]
[ 31 27 23]
[181 174 163]
[219 213 210]
[255 255 255]]
np.append 和 np.concatenate
## concatenate
import numpy as np
a = np.array([[1, 2, 3],
[2, 2, 2]])
b1 = np.array([4, 5, 6])
b2 = np.array([[4, 5, 6]])
# c1 = np.concatenate((a, b1), 0)
c2 = np.concatenate((a, b2), 0)
d = np.append(a, b1)
# print(c1) # 报错:ValueError: all the input arrays must have same number of dimensions
print(c2)
print()
print(d)
[[1 2 3]
[2 2 2]
[4 5 6]]
[1 2 3 2 2 2 4 5 6]
小结:
(1)np.append
- 是在一个维度上新增一个元素
- 待加入的数据需要在一个维度上满足 大小
- 需要定义axis(axis=0表示“行”)
(2)np.concatenate() - 是两个相同维度的向量进行拼接,除了 append()类似的要求,还需要有相同的维度