Python列添加带移位的numpy数组

时间:2014-02-25 04:13:54

标签: python arrays numpy iteration

如何使用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数组的列添加?

2 个答案:

答案 0 :(得分:2)

out = a[:, :-shift] + mult_factor * a[:, shift:]

我认为这是你正在寻找的东西。它是循环的矢量化形式,在a的大片上运行,而不是逐列。

答案 1 :(得分:0)

我不是肯定的我完全理解计算出的数量应该是多少,但这里有两件与你所要求的东西密切相关的东西:

  1. 如果您有一个名为a的2D数组,您希望将其转换为1D数组的列表,这些数组是a的列,您可以执行此操作

    cols = [c for a.T]

  2. 如果我没有弄错的话,看起来你想要的就可以用矩阵乘法来完成。您可以使用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)

  3. 对于大型矩阵,如果您只想添加两列或几列T,则可以使用a的稀疏矩阵。