使用两个3D数组中的条目的函数(Python)

时间:2017-03-01 14:19:01

标签: python arrays function numpy

所以,让我说我有两个数组(numpy数组):

array1 = 
[[[1, 0, 0], [0, 6, 0], [3, 0, 0]],
[[0, 2, 4], [0, 4, 0], [0, 4, 0]],
[[0, 0, 2], [1, 3, 2], [3, 4, 0]]]

array2 = 
[[[2, 4, 0], [0, 4, 0], [3, 0, 0]],
[[0, 0, 3], [1, 4, 3], [2, 4, 3]],
[[0, 0, 1], [0, 2, 1], [1, 0, 2]]]

然后我做了一个函数:

def array_calc(x,y,z):
    x*y+z

我现在要做的是让x值来自array1和来自array2的y值,而z值只是我选择的常量(让我们说z = 0),然后对数组的每个条目进行计算,最终得到一个新数组,计算完成后,得到类似的结果:

array_result = 
[[[2, 0, 0], [0, 24, 0], [9, 0, 0]],
[[0, 0, 12], [0, 16, 0], [0, 16, 0]],
[[0, 0, 2], [0, 6, 2], [3, 0, 0]]]

但是,我不太确定如何做到这一点。

3 个答案:

答案 0 :(得分:3)

如果您的数组是numpy数组,那么它就像:

一样简单
import numpy as np

x = np.array([[1,0],[0,1]])
y = np.array([[4,1],[0,2]])
z = 1

result = x*y + z

# result = array([[5, 1], [1, 3]])

答案 1 :(得分:0)

使用简单的for循环:

import numpy as np

def array_calc(x, y, z):
"""Returns x * y + z with x and y 3D Numpy arrays and z a number"""
    new_arr = x.copy()
    for i in np.arange(x.shape[0]):
        for k in np.arange(x.shape[1]):
            for j in np.arange(x.shape[2]):
                new_arr[i, k, j] = x[i, k, j] * y[i, k, j] + z

return new_arr

使用:

array1 = np.array([[[1, 0, 0], [0, 6, 0], [3, 0, 0]],
[[0, 2, 4], [0, 4, 0], [0, 4, 0]],
[[0, 0, 2], [1, 3, 2], [3, 4, 0]]])

array2 = np.array([[[2, 4, 0], [0, 4, 0], [3, 0, 0]],
[[0, 0, 3], [1, 4, 3], [2, 4, 3]],
[[0, 0, 1], [0, 2, 1], [1, 0, 2]]])

返回:

array([[[ 3,  1,  1],
    [ 1, 25,  1],
    [10,  1,  1]],

   [[ 1,  1, 13],
    [ 1, 17,  1],
    [ 1, 17,  1]],

   [[ 1,  1,  3],
    [ 1,  7,  3],
    [ 4,  1,  1]]])

答案 2 :(得分:0)

我能想到的方法是迭代它们并执行计算。 这也可以用3维数组完成,但我发现使用2维数组更容易实现。我相信必须有办法进一步降低复杂性。因为3 for for循环不是一个好的解决方案。它完成了工作。

代码在这里。

array1 = [[[1, 0, 0], [0, 6, 0], [3, 0, 0]],[[0, 2, 4], [0, 4, 0], [0, 4, 0]],[[0, 0, 2], [1, 3, 2], [3, 4, 0]]]
array2 = [[[2, 4, 0], [0, 4, 0], [3, 0, 0]], [[0, 0, 3], [1, 4, 3], [2, 4, 3]], [[0, 0, 1], [0, 2, 1], [1, 0, 2]]]
z=0
array_1 = reduce(list.__add__, array1)
array_2 = reduce(list.__add__, array2)
array_3 = [[0,0,0] for _ in xrange(9)]
len_array=9
for i in range(len_array):
  for l in range(3):
    array_3[i][l] = array_1[i][l]*array_2[i][l]+z
print array_3