通过跨数组的计算创建numpy数组



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

下面您将看到一个函数,它将array输入到函数the_matrix中,并返回adj_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循环的变体,它抛出了错误。首先,For循环中的a正在显示输入参数array,这很奇怪,因为在该阶段循环中还没有调用它。这里我的目的是引用ref_array中的确切单元格。

不确定我在这里哪里出错了,我是如何不正确地循环通过的。感谢任何帮助

您的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是一个"row"数组本身为一维对象类型数组。

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

你对备选方案的描述很模糊。但是假设它尝试从数字类型数组

开始
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显示了输入参数array"很可能是因为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]])

最新更新