首页 > 解决方案 > 从跨数组的计算中创建 numpy 数组

问题描述

我目前的任务是创建一个对单元格执行操作的 4x4 数组

下面你会看到一个函数,它接受返回的array函数the_matrixadj_array

然后它有一个应该循环的for循环array,查看单元格ref_array并在找到匹配的前两个数字array(如6,3“)时,它将将该函数lambda N: 30放入它的相应单元格中adj_array,就像它会做的那样对于 4x4 矩阵中的所有单元格

本质上,该函数应该返回一个像这样的数组

array([[inf, <function <lambda> at 0x00000291139AF790>,
<function <lambda> at 0x00000291139AF820>, inf],
[inf, inf, inf, <function <lambda> at 0x00000291139AF8B0>],
[inf, inf, inf, <function <lambda> at 0x00000291139AF940>],
[inf, inf, inf, inf]], dtype=object)

到目前为止我的工作如下

def the_matrix(array):
  

    ref_array = np.zeros((4,4), dtype = object)
    ref_array[0,0] = (5,0)
    ref_array[0,1] = (5,1)
    ref_array[0,2] = (5,2)
    ref_array[0,3] = (5,3)
    ref_array[1,0] = (6,0)
    ref_array[1,1] = (6,1)
    ref_array[1,2] = (6,2)       
    ref_array[1,3] = (6,3)       
    ref_array[2,0] = (7,0)     
    ref_array[2,1] = (7,1)       
    ref_array[2,2] = (7,2)      
    ref_array[2,3] = (7,3)
    ref_array[3,0] = (8,0)
    ref_array[3,1] = (8,1)
    ref_array[3,2] = (8,2)
    ref_array[3,3] = (8,3)
 
   
    for i in ref_array:
        for a in i: #Expecting to get (5,1) here, but's showing me array
            if a == array[0, 0:2]: #This specific slice was a test
             put the function in that cell for adj_array

    return adj_array

array = np.array([[5, 1, lambda N: 120],
                  [5, 2, lambda N: 30],
                  [6, 3, lambda N: 30],
                  [7, 3, lambda N: N/30]])

已经尝试过这个 for 循环的变体,它会抛出错误。一方面,afor 循环中的 显示输入参数array,这很奇怪,因为在那个阶段还没有在循环中调用它。我的意图是引用 ref_array 中的确切单元格。

不知道我在哪里出错以及我如何不正确地循环。任何帮助表示赞赏

标签: pythonarraysnumpymatrixnodes

解决方案


ref_array是对象 dtype, (4,4) 包含元组:

In [26]: ref_array
Out[26]: 
array([[(5, 0), (5, 1), (5, 2), (5, 3)],
       [(6, 0), (6, 1), (6, 2), (6, 3)],
       [(7, 0), (7, 1), (7, 2), (7, 3)],
       [(8, 0), (8, 1), (8, 2), (8, 3)]], dtype=object)

您的迭代,仅显示迭代变量。我正在使用`repr

In [28]: for i in ref_array:
    ...:     print(repr(i))
    ...:     for a in i:
    ...:         print(repr(a))
    ...: 
array([(5, 0), (5, 1), (5, 2), (5, 3)], dtype=object)
(5, 0)
(5, 1)
(5, 2)
(5, 3)
...

数组的“行”也是如此i,它本身就是一维对象 dtype 数组。

a是其中一个对象,一个元组。

您对替代方案的描述含糊不清。但是假设尝试从数字 dtype 数组开始

In [30]: arr = np.array(ref_array.tolist())
In [31]: arr
Out[31]: 
array([[[5, 0],
        [5, 1],
        [5, 2],
        [5, 3]],

         ...
        [8, 2],
        [8, 3]]])
In [32]: arr.shape
Out[32]: (4, 4, 2)

现在循环:

In [33]: for i in arr:
    ...:     print(repr(i))
    ...:     for a in i:
    ...:         print(repr(a))
    ...: 
array([[5, 0],          # i is a (4,2) array
       [5, 1],
       [5, 2],
       [5, 3]])
array([5, 0])           # a is (2,) array....
array([5, 1])
array([5, 2])
array([5, 3])

如果“for 循环中的 a 正在显示输入参数数组”,则很可能是因为aIS a 是一个数组。

请记住,对象 dtype 数组是以列表速度处理的。您不妨将它们视为混蛋列表。虽然它们有一些数组增强(多维索引等),但元素仍然是引用,并且像在列表中一样处理。

我没有注意你为什么要放入lambdas数组中。它看起来很丑,我看不出它能给你带来什么。它们不能以阵列速度“评估”。您必须进行某种迭代或列表理解。

编辑

一种更直接的生成 的方法arr,源自ref_array

In [39]: I,J = np.meshgrid(np.arange(5,9), np.arange(0,4), indexing='ij')
In [40]: I
Out[40]: 
array([[5, 5, 5, 5],
       [6, 6, 6, 6],
       [7, 7, 7, 7],
       [8, 8, 8, 8]])
In [41]: J
Out[41]: 
array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])
In [42]: arr = np.stack((I,J), axis=2)  # shape (4,4,2)

如果函数类似于

In [46]: def foo(I,J):
    ...:     return I*10 + J
    ...: 

您可以轻松地为 中的每对值生成一个值ref_array

In [47]: foo(I,J)
Out[47]: 
array([[50, 51, 52, 53],
       [60, 61, 62, 63],
       [70, 71, 72, 73],
       [80, 81, 82, 83]])

推荐阅读