如何使用python numpy数组进行移位添加列?
我有二维数组,需要它的扩展副本。
a = array([[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]])
我想要类似的东西(以下是伪代码,它不起作用;据我所知,a.columns
中没有numpy
:
shift = 3
mult_factor = 0.7
for column in a.columns - shift :
out[column] = a[column] + 0.7 * a[column + shift]
我也知道,我可以使用索引做类似于我需要的东西。但我似乎真的有点过多地枚举三个值而只使用一个(j):
for (i,j),value in np.ndenumerate(a):
print i,j
我创建了,我可以遍历列,但不能迭代它们的索引:
for column in a.T:
print column
虽然我可以简单地使用类似于xrange的东西,但应用于多维数组:
In [225]: for column in np.ndindex(a.shape[1]):
print column
.....:
(0,)
(1,)
(2,)
(3,)
(4,)
所以现在我只知道如何用简单的xrange做到这一点,我不确定,这是最好的解决方案。
out = np.zeros(a.shape)
shift = 2
mult_factor = 0.7
for i in xrange(a.shape[1]-shift):
print a[:, i]
out[:, i] = a[:, i] + mult_factor * a[:, i+shift]
然而,在Python中它可能不会那么快。 你能给我一个关于它在性能方面的建议吗?也许有更快的方法来实现带有shift的numpy数组的列添加?
答案 0 :(得分:2)
out = a[:, :-shift] + mult_factor * a[:, shift:]
我认为这是你正在寻找的东西。它是循环的矢量化形式,在a
的大片上运行,而不是逐列。
答案 1 :(得分:0)
我不是肯定的我完全理解计算出的数量应该是多少,但这里有两件与你所要求的东西密切相关的东西:
如果您有一个名为a
的2D数组,您希望将其转换为1D数组的列表,这些数组是a
的列,您可以执行此操作
cols = [c for a.T]
如果我没有弄错的话,看起来你想要的就可以用矩阵乘法来完成。您可以使用numpy.diag
在numpy中创建带状矩阵,或者,因为沿着每个band 1,mult_factor或0将具有相同的值,您可以使用scipy.linalg.toeplitz
m,n = a.shape
band = np.eye(1,n)
band [0,shift] = mult_factor
T = scipy.linalg.toeplitz(np.eye(1,m),band)
out = np.inner(a,T)
对于大型矩阵,如果您只想添加两列或几列T
,则可以使用a
的稀疏矩阵。