numpy insert&附加

时间:2016-12-29 14:04:41

标签: python arrays numpy

我有一个数组:

X   ndarray   180x360

以下不起作用

X = numpy.append(X, X[:,0], 1)

因为X[:,0]的尺寸错误。

这不奇怪吗?

这种问题看起来有点脏:

X = numpy.append(X, numpy.array(X[:,0],ndmin=2).T, axis=1)

在MATLAB中,人们可以写:X(:,361) = X(:,1) !!!

我开始意识到这也有效:

X = numpy.insert(X, 361, X[:,0], axis=1)

但为什么追加不起作用?

谢谢蛇

3 个答案:

答案 0 :(得分:0)

您可以在X[:,0]上创建新轴:

np.append(X, X[:,0,None], axis=1)

我认为你必须匹配数组形状的原因是numpy.append是使用concatenate实现的。

答案 1 :(得分:0)

原因是使用一个整数进行索引会删除该轴:

>>> X[:, 0].shape
(180,)

这是一个一维数组,但是如果你通过给出一个开始和停止的索引来保持轴:

>>> X[:, 0:1].shape
(180, 1)

可以正确附加到您的数组:

>>> np.append(a, a[:, 0:1], 1)
array([....])

但如果你发现自己appendingconcatenating发现了许多阵列,那么这一切就被警告了:这些极其低效。大部分时间它都比较好找到另一种方法,例如在开头创建一个更大的数组,然后通过切片设置行/列:

X = np.zeros((180, 361))
X[:, 360] = X[:, 0]  # much more efficient than appending or inserting

答案 2 :(得分:0)

一个关键的区别是,在MATLAB中,一切都至少有2个维度。

>> size(x(:,1))
ans =
   2   1

并且正如您所注意到的,它允许索引“超越结束” - 超越

>> x(:,10)=x(:,1)
x =
   1   2   3   1   0   0   0   0   0   1
   4   5   6   4   0   0   0   0   0   4

但是在numpy索引中减少了维度,没有2d:

In [1675]: x = np.ones((3,4),int)
In [1676]: x.shape
Out[1676]: (3, 4)
In [1677]: x[:,0].shape
Out[1677]: (3,)

这意味着如果我想复制一个列,我需要确保它仍然是concatenate中的一列。有很多方法可以做到这一点。

x[:,0][:,None] - 使用np.newaxis(别名None)是一种不错的通用方法。 x[:,[0]]x[:,0:1]x[:,0].reshape(-1,1)也有自己的位置。

append只是concatenate用2替换参数列表。这是对列表追加的混淆模仿。它是用Python编写的,所以你可以阅读它(正如经验丰富的MATLAB程序员那样)。

insert是一个更复杂的函数(也在Python中)。最后添加它会像:

In [1687]: x.shape
Out[1687]: (3, 4)
In [1688]: res=np.empty((3,5),int)
In [1689]: res[:,:4] = x
In [1690]: res[:,-1] = x[:,0] 

最后的作业是有效的,因为两面都有相同的形状(技术上它们只需要是可广播的形状)。因此,insert并未告诉我们在concatenate等更基本的操作中应该或不应该起作用的任何内容。