使用NumPy更好的解决方案

时间:2017-09-27 16:05:03

标签: python arrays numpy

假设我们有输入2D numpy数组,矩阵和对角元素的返回乘积的函数。 我想将这样的函数应用于矩阵数组并获得结果数组。当然,有天真的方法。例如:

def our_func():
    ...

array_of_matrixes = [...]
results = []
for curr_matrix in array_of_matrixes:
    results.append(out_func(curr_matrix))

NumPy有更好的解决方法吗?我尝试使用.apply_over_axes.apply_along_axis,但这些不合适。

2 个答案:

答案 0 :(得分:1)

np.apply_along_axisnp.vectorize无法正常工作的原因是,如果您的矩阵具有相同的形状,numpy会压平矩阵数组并尝试将our_func应用于每个矩阵每个矩阵中的单个单元格,未定义。

你可以替换

results = []
for curr_matrix in array_of_matrixes:
    results.append(out_func(curr_matrix))

使用:

map(our_func, array_of_matrixes)

它不会更有效率,但它更简洁,也可能更清晰。

这是一个完整的例子:

import numpy as np
a = np.matrix('1 2;3 4')
b = np.matrix('3 1 4;1 2 2;1 3 6')
c = np.matrix('2 1;1 6')
matrices = np.array([a,b,c])
def our_func(m):
    return np.prod(np.diagonal(m))

print(list(map(our_func, matrices)))
# [4, 36, 12]

答案 1 :(得分:1)

使用列表理解可以使这更简洁的一种方法是:

<job id="readMultiFileJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1" next="deleteDir">
        <tasklet>
            <chunk reader="multiResourceReader" writer="flatFileItemWriter"
                commit-interval="1" />
        </tasklet>
    </step>
    <step id="deleteDir">
        <tasklet ref="fileDeletingTasklet">
        </tasklet>
    </step>
</job>