我有一个3D矩阵(张量),可以访问
m[x][y][z]
我想找到并保存非零元素。他们的索引…(因为这个矩阵是稀疏的)..
所以等价的代码是:for i, x in enumerate(m):
if x:
for j,y in enumerate(x):
if y:
for k,z in enumerate(y):
if z:
print i,j,k, z
我想得到类似的效果,但只使用lambdas, map和reduce..
您可以使用numpy。例子:
import numpy as np
...
arr = np.arry(m)
non_zeros = np.transpose(np.nonzero(arr))
见http://docs.scipy.org/doc/numpy/reference/generated/numpy.nonzero.html
希望能有所帮助。
正如Pankaj Sharma所提到的,numpy是Python中最适合矩阵的。
也可以使用itertools:
from itertools import product
d3 = [[[0 for col in range(3)]for row in range(3)] for x in range(3)]
d3[0][2][2] = 1
for i, j, k in product(xrange(3), xrange(3), xrange(3)):
if(d3[i][j][k]): print "%s %s %s = %s" % (i, j, k, d3[i][j][k])
输出:0 2 2 = 1
如果你仍然坚持Lambda/Map/Reduce:
from __future__ import print_function # we need print as function to use within lamdba
d3 = [[[0 for col in range(3)]for row in range(3)] for x in range(3)]
d3[0][2][2] = 1
d3[1][2][2] = 2
d3 = reduce(list.__add__, reduce(list.__add__, d3)) # get flatten matrix
map(lambda x: print(x[0]/9, (x[0] - (x[0]/9)*9)/3, x[0] % 3, '=', x[1]), [(i, e) for i, e in enumerate(d3) if e != 0])
#print x / 9 # i
#print (x - (x/9)*9) / 3 # j
#print x % 3 # k
输出:0 2 2 = 1
有一个丑陋的解决方案是使用map reduce过滤器第一个映射和过滤器,以获得仅包含非零值的新矩阵,并添加索引:
new_matrix = map(lambda (k,z):map(lambda (j,y):map(lambda (i,x): [k,j,i,x], enumerate(filter( lambda val: val>0, y))), enumerate(z)), enumerate(m))
然后减少:
non_zeros = reduce(lambda a,b: reduce(lambda c,d: c+d, a)+reduce(lambda c,d: c+d, b), new_matrix)