如何将一列值除以前一行列(不是同一列)并将结果作为新维度添加到numpy数组?

时间:2012-07-02 16:25:48

标签: python arrays numpy

我想要做的就是采用这样的numpy数组:

[[1, 2,  4, 7,  9, 15,  0],
 [3, 4,  3, 5, 10,  2, -2],
 [5, 6, 56, 7, 20,  1,  2]]

我想把最后一行的每一行划分为前一行的第4列并取结果并将其作为新维度添加到数组中,我想要的输出应该如下所示

[[1, 2,  4, 7,  9, 15,  0,  0],
 [3, 4,  3, 5, 10,  2, -2, -.2857],
 [5, 6, 56, 7, 20,  1,  2, .4]]

这可以在没有for循环的情况下完成吗? (好吧,我想如果没有for循环这样做是没有效率的)但是我仍然不确定如何用它来做到这一点

4 个答案:

答案 0 :(得分:2)

import numpy as np
myarray = np.array([[1,2,4,7,9,15,0.0], [3, 4,3,5,10,2,-2], [5,6,56,7,20,1,2]])
#the division:
column_divs = myarray[:,-1][1:] / myarray[:,3][:-1]
#adds a 'placeholder' zero value, as the first element:
column_divs = np.hstack(([0], column_divs))
#adds the required column to the end of the array:
print np.hstack((myarray, column_divs.reshape(-1,1)))
#output:
[[  1.      2.       4.       7.       9.      15.      0.       0.        ]
 [  3.      4.       3.       5.      10.       2.     -2.      -0.28571429]
 [  5.      6.      56.       7.      20.       1.      2.      0.4        ]]

答案 1 :(得分:1)

import numpy as np
lis=[[1, 2,  4, 7,  9, 15,  0],
 [3, 4,  3, 5, 10,  2, -2],
 [5, 6, 56, 7, 20,  1,  2]]
new_lis=[lis[i][:]+[lis[i][-1]/lis[i][3]] for i in range(len(lis))]
nparray=np.matrix(new_lis)

答案 2 :(得分:1)

您需要使用np.concatenate

np.concatenate((a, np.concatenate(([[0]], a[1:, [-1]] / a[:-1, [3]].astype(float)))), axis=1)

如果你的数组有int dtype,那么Python {x}需要astype(float)

也可以使用hstackvstack

编写
np.hstack((a, np.vstack(([[0]], a[1:, [-1]] / a[:-1, [3]].astype(float)))))

可以使用roll

,而不是对行进行切片
np.hstack((a, np.vstack((a[:, [-1]] / np.roll(a[:, [3]], 1).astype(float)))))

答案 3 :(得分:0)

预先为非答案道歉,但除非您优先考虑算法纯度而不是性能,否则您肯定希望使用for循环或类似构造来执行此操作。

可能有一种方法可以通过矩阵运算完全实现这一点(将原始数据与自定义内核相乘并将结果连接为原始矩阵上的新列),但效率不高。考虑到Strassen的算法(两个平方矩阵的有效乘法的一个例子)是O(n^log7)或〜O(n^2.807),其中n是矩阵的大小乘以元素的数量。 for循环将为O(m),其中m是相关矩阵中的行数。