所需阵列与原始阵列a
的形状不同。 因此,您不能通过使用简单片 分配或单个调用分配函数(如numpy.place
,numpy.put
,numpy.putmask
, 或numpy.copyto
)来生成所需的阵列。
因此,我认为 可能更好地把它看作是一个新数组的构造,而不是把它当作赋值和插入操作。 有很多方法可以做到这一点:
你可以使用numpy.concatenate
:
np.concatenate([a[:,:1], b, a[:,2:]], axis=1)
或numpy.column_stack
:
np.column_stack([a[:,:1], b, a[:,2:]])
或numpy.c_
:
np.c_[a[:,:1], b, a[:,2:]]
或numpy.bmat
:
np.array(np.bmat([a[:,:1], b, a[:,2:]]))
或空数组分配空间和赋值的c
片:
c = np.empty((a.shape[0], a.shape[1]+b.shape[1]-1), dtype=a.dtype)
c[:, :1] = a[:, :1]
c[:, 1:4] = b
c[:, 4:] = a[:, 2:]
这是没有必要在这里,但它是很好的保持在介意分配和分配是构建数组的可行方法。有时候,尽管不在这里,它甚至是你最快的选择。
或numpy.delete
和numpy.insert
:
np.insert(np.delete(a, [1], 1), [1], b, axis=1)
我不推荐使用insert
和delete
但是。 np.delete
创建一个 值从a
复制的新阵列。相反,切片a[:,:1]
和 a[:,2:]
是的意见的a
所以他们不需要任何复制。额外的 分配和复制使得该方法比上面显示的其他方法 慢。
例如,如果我们定义:
import numpy as np
a = np.array([[ 0., 2., 0., 0., 0., 0.],
[ 0., 14., 0., 0., 0., 0.]])
b = np.array([(1, 0, 0),
(0, 0, 1)])
然后
In [69]: np.concatenate([a[:,:1],b,a[:,2:]], axis=1)
Out[69]:
array([[ 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 0.]])
(其他选项产生相同的结果)
我会用切片和'place()',参见http://docs.scipy.org/doc/numpy/reference/generated/numpy.pl ace.html – madtowneast 2015-02-09 17:52:08
对于'2',您正在替换一个值。对于'14',你正在替换一个值(用0)并插入一个(2,2)数组。两种不同的行为。 – hpaulj 2015-02-09 20:35:44