0

我想要做的是采用这样的 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

4 回答 4

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        ]]
于 2012-07-02T16:49:42.347 回答
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)
于 2012-07-02T16:40:32.937 回答
1

你会想要使用np.concatenate

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

如果您的astype(float)数组具有 int dtype,则 Python 2.x 需要 。

这也可以用hstackand来写vstack

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)))))
于 2012-07-02T16:43:20.697 回答
0

提前为未回答的问题道歉,但除非您优先考虑算法纯度而不是性能,否则您肯定希望使用 for 循环或类似结构来做到这一点。

可能有一种方法可以完全通过矩阵运算来完成此操作(将原始值乘以自定义内核并将结果连接为原始矩阵上的新列),但效率不高。O(n^log7)考虑Strassen算法(两个方阵的有效乘法示例O(n^2.807)n是 一个 for 循环将是O(m),其中m是相关矩阵中的行数。

于 2012-07-02T16:39:25.403 回答