python - 从跨数组的计算中创建 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 循环的变体,它会抛出错误。一方面,a
for 循环中的 显示输入参数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
,它本身就是一维对象 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 正在显示输入参数数组”,则很可能是因为a
IS 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]])
推荐阅读
- load-balancing - F5 - A10 负载均衡器迁移
- sql - SQL Server - 分组依据 - 附加列
- java - 锁定一个随机数组,以便可以从其他方法处理它而不会被随机化
- python - Gitlab CI/CD 中的 Tika-OCR python 测试
- r - 如何基于另一列创建具有重复值的新列?
- python - 在 Scrapy Splash 中使用 Crawlera lua 脚本时如何获取 session_id?
- git - 如何在不修改 git 历史记录的情况下在我的源代码上运行代码格式化程序?
- configuration - Spring Cloud Contract 在运行时设置`stubsMode`
- unix - 如何删除任何包含数字的行?
- javascript - 如何通过 jQuery 添加/更新参数到 href 属性?