Python 用数组对象的一维数组生成矩阵
我想转换numpy矩阵中数组对象的1-D数组,以执行行上元素的求和。阵列的一维阵列为:Python 用数组对象的一维数组生成矩阵,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我想转换numpy矩阵中数组对象的1-D数组,以执行行上元素的求和。阵列的一维阵列为: out = array([[array([0]), array([ 23.]), array([0]), array([0]), array([ 1., 0.]), array([0]), array([0]), array([0])], [array([ 0.]), array([ 0.]), array([ 18.]), array([ 0.]), array([ 0.]), a
out = array([[array([0]), array([ 23.]), array([0]), array([0]),
array([ 1., 0.]), array([0]), array([0]), array([0])],
[array([ 0.]), array([ 0.]), array([ 18.]), array([ 0.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 19.]), array([ 15.]), array([ 25.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 1.])],
[array([ 0.]), array([ 0.]), array([ 20.]), array([ 20.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 22.]), array([ 26.]), array([ 23.]), array([ 18.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 0.]), array([ 20.]), array([ 13.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 16.]), array([ 20.]), array([ 18.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 0.]), array([ 18.]), array([ 0.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([0]), array([ 23.]), array([0]), array([0]),
array([ 1., 0.]), array([0]), array([0]), array([0])]], dtype=object)
首先,我想对不同数组中的双值(如果存在)求和,这是第一个数组(1+0)和最后一个数组(1+0)的情况,以得到具有所有单值的最终1D数组:
out 2 = array([[array([0]), array([ 23.]), array([0]), array([0]),
array([ 1]), array([0]), array([0]), array([0])],
[array([ 0.]), array([ 0.]), array([ 18.]), array([ 0.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 19.]), array([ 15.]), array([ 25.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 1.])],
[array([ 0.]), array([ 0.]), array([ 20.]), array([ 20.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 22.]), array([ 26.]), array([ 23.]), array([ 18.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 0.]), array([ 20.]), array([ 13.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 16.]), array([ 20.]), array([ 18.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([ 0.]), array([ 0.]), array([ 18.]), array([ 0.]),
array([ 0.]), array([ 0.]), array([ 0.]), array([ 0.])],
[array([0]), array([ 23.]), array([0]), array([0]),
array([ 1.]), array([0]), array([0]), array([0])]], dtype=object)
一旦我得到“out2”,我想用它制作一个矩阵(8X8,不应考虑out2的最后一个数组,因为它等于第一个数组),这样“out2”的第一个数组将是新矩阵的第一个原始数组,第二个数组将是第二个原始数组,依此类推。其思想是将新矩阵第一列的前两行和第一列的后两行相加,直到所有列结束
最终输出应由4个阵列组成(总和之后):
在numpy如何做到这一点?谢谢你我不太清楚那
out2
和所有那些元素数组
;也许这只是一个你并不真正需要的中间步骤。无论如何,您可以使用map
将sum
应用于行中的所有子列表。这将生成一个本地Python列表列表,然后可以使用数组将其转换回numpy
矩阵:
from numpy import array
out = array([[array([0]), ..., array([0])]], dtype=object)
matrix = array(map(lambda row: map(sum, row), out))
matrix
:(或者,使用matrix=matrix[:-1,:]
排除最后一行。)
现在,您可以使用,例如,matrix[0:2,:]
来获取该矩阵的前两行,转置它们,并使用map
和sum
来获取列的和。应用array
获取numpy
数组
sum1 = array(map(sum, matrix[0:2,:].transpose()))
当然,您也可以通过从一个列表中创建一个数组
,将所有这些都放入一个4x8矩阵中。这里,sum[0]
将对应于上面的sum1
sums = array([map(sum, matrix[i:i+2,:].transpose())
for i in range(0, len(matrix), 2)])
或者,更简单的是,使用numpy
矩阵加法,将从第0行开始的矩阵每隔一行(matrix[0::2]
)与从第1行开始的矩阵每隔一行(matrix[1::2]
)相加:
总和的输出:(sum4
是错误的;您使用了第8行和第9行。)
如果你真的需要这样做。我怀疑你的代码有很多问题。可能是,我是numpy的初学者。有没有一种方法不经过数组->矩阵转换就可以做到这一点?不可能在矩阵上迭代并用最终的4X8矩阵将两行相加吗?@diegus你是什么意思?相对于那些map/sum/zip结构,您更喜欢for循环,还是希望在一个循环中创建所有四个和?我以为你想要四个独立的求和变量。我更喜欢在一个循环中创建所有四个求和,因为我必须处理一个更大的矩阵,并且不可能写出sum1,sum2,sum3,…sumn。谢谢
sum1 = array(map(sum, matrix[0:2,:].transpose()))
sums = array([map(sum, matrix[i:i+2,:].transpose())
for i in range(0, len(matrix), 2)])
sums = matrix[0::2] + matrix[1::2]
[[ 0. 23. 18. 0. 1. 0. 0. 0.]
[ 0. 19. 35. 45. 0. 0. 0. 1.]
[ 22. 26. 43. 31. 0. 0. 0. 0.]
[ 0. 16. 38. 18. 0. 0. 0. 0.]]