我想要做的就是采用这样的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循环这样做是没有效率的)但是我仍然不确定如何用它来做到这一点
答案 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)
。
也可以使用hstack
和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)))))
答案 3 :(得分:0)
预先为非答案道歉,但除非您优先考虑算法纯度而不是性能,否则您肯定希望使用for循环或类似构造来执行此操作。
可能有一种方法可以通过矩阵运算完全实现这一点(将原始数据与自定义内核相乘并将结果连接为原始矩阵上的新列),但效率不高。考虑到Strassen的算法(两个平方矩阵的有效乘法的一个例子)是O(n^log7)
或〜O(n^2.807)
,其中n
是矩阵的大小乘以元素的数量。 for循环将为O(m)
,其中m
是相关矩阵中的行数。