我有一个数组:
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)
但为什么追加不起作用?
谢谢蛇
答案 0 :(得分:0)
答案 1 :(得分:0)
原因是使用一个整数进行索引会删除该轴:
>>> X[:, 0].shape
(180,)
这是一个一维数组,但是如果你通过给出一个开始和停止的索引来保持轴:
>>> X[:, 0:1].shape
(180, 1)
可以正确附加到您的数组:
>>> np.append(a, a[:, 0:1], 1)
array([....])
但如果你发现自己appending
和concatenating
发现了许多阵列,那么这一切就被警告了:这些极其低效。大部分时间它都比较好找到另一种方法,例如在开头创建一个更大的数组,然后通过切片设置行/列:
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
等更基本的操作中应该或不应该起作用的任何内容。