我需要完成以下任务:
从:
a = array([[1,3,4],[1,2,3]...[1,2,1]])
(向每行添加一个元素)到:
a = array([[1,3,4,x],[1,2,3,x]...[1,2,1,x]])
我已经尝试做类似a [n] = array([1,3,4,x])的事情
但是numpy抱怨形状不匹配。我尝试遍历a
并将元素x附加到每个项目,但是更改未反映出来。
关于如何实现此目标的任何想法?
Answers:
对于有python经验的人来说,将数据追加到现有数组是很自然的事情。但是,如果您发现自己定期附加到大型数组,则会很快发现NumPy不能像python那样轻松或有效地做到这一点list
。您会发现,每个“追加”操作都需要重新分配阵列内存,并使内存需求短期增加一倍。因此,解决该问题的更通用的方法是尝试分配与算法最终输出一样大的数组。然后,对该数组的子集(切片)执行所有操作。理想情况下,应最小化阵列的创建和销毁。
就是说,这通常是不可避免的,执行此操作的功能是:
对于二维数组:
对于3-D阵列(上面加上):
对于ND阵列:
r_
,这是我个人最常使用的,因为它允许串联标量。
通过将标量扩展为python-list-type,可以简单地添加单个标量,如已显示的(并且无需转换为float):
import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
x = 10
b = np.hstack ((a, [[x]] * len (a) ))
返回b
为:
array([[ 1, 3, 4, 10],
[ 1, 2, 3, 10],
[ 1, 2, 1, 10]])
可以通过以下方式添加一行:
c = np.vstack ((a, [x] * len (a[0]) ))
返回c
为:
array([[ 1, 3, 4],
[ 1, 2, 3],
[ 1, 2, 1],
[10, 10, 10]])
np.insert也可以用于此目的
import numpy as np
a = np.array([[1, 3, 4],
[1, 2, 3],
[1, 2, 1]])
x = 5
index = 3 # the position for x to be inserted before
np.insert(a, index, x, axis=1)
array([[1, 3, 4, 5],
[1, 2, 3, 5],
[1, 2, 1, 5]])
index
也可以是list
/tuple
>>> index = [1, 1, 3] # equivalently (1, 1, 3)
>>> np.insert(a, index, x, axis=1)
array([[1, 5, 5, 3, 4, 5],
[1, 5, 5, 2, 3, 5],
[1, 5, 5, 2, 1, 5]])
或一个 slice
>>> index = slice(0, 3)
>>> np.insert(a, index, x, axis=1)
array([[5, 1, 5, 3, 5, 4],
[5, 1, 5, 2, 5, 3],
[5, 1, 5, 2, 5, 1]])