将迭代的值存储到numpy数组-Python,numpy
因此,我正在努力使这段代码对更大的数据集更有用。这是代码,以后我会详细解释:将迭代的值存储到numpy数组-Python,numpy,python,arrays,list,numpy,Python,Arrays,List,Numpy,因此,我正在努力使这段代码对更大的数据集更有用。这是代码,以后我会详细解释: import numpy as np np.set_printoptions(threshold='nan') tri_nums = [3, 2, 1] paths = [1, 3, 4, 5] vol_list = [10, 10, 10, 15, 15, 25] n = 0 array_list = [] while n <= len(tri_nums): for num in tri_
import numpy as np
np.set_printoptions(threshold='nan')
tri_nums = [3, 2, 1]
paths = [1, 3, 4, 5]
vol_list = [10, 10, 10, 15, 15, 25]
n = 0
array_list = []
while n <= len(tri_nums):
for num in tri_nums:
print "assigning volume", vol_list[sum(tri_nums)-len(vol_list)+1]
volume_array = np.zeros(shape = (6, 6))
volume_array[paths[num-1],paths[num]] = vol_list[sum(tri_nums)-len(vol_list)+1]
array_list.append(volume_array)
print paths[num-1], paths[num]
tri_nums.pop(0)
paths.pop(0)
n+=1
print paths
print tri_nums
final_array = sum(array_list)
print array_list
print final_array
列表路径
(在原始情况下)由四个“节点”(节点1、3、4和5)组成。在每个相邻节点之间有一条路径,即路径1-3、3-4、4-5
可以看到,volume_数组
是一个6x6数组,由零组成。要更改的volume\u数组中的行值对应于每个路径的第一个值,即1
、3
、4
。列值对应于每个路径的第二个数字,即3
,4
,5
棘手的一点来了
vol_list
中的值分配给上述数组项,如下所示:
对于tri\u nums
的每个值,将vol\u列表中的一个值添加到volume\u数组中。此数组中的行值由路径的第一个值定义,即[4]
,列值由路径的第二个值定义(对于值[4]
,这意味着[5]
)李>
对于tri\u nums[0]
,将值10
添加三次,一次添加到volume\u array[4][5]
,一次添加到volume\u array[3][4]
,一次添加到volume\u array[1][3]
李>
对于tri\u nums[1]
值15
添加两次,一次添加到volume\u array[4][5]
中,一次添加到volume\u array[3][4]
对于tri\u nums[2]
值25
将一次添加到volume\u数组[4][5]
李>
最后,将前面三个步骤中生成的数组中的所有值相加,得到final\u array
李>
另一件值得一提的事情是tri\u nums
的总和等于len(vol\u list)
。此外,tri\u nums[n]
始终是>tri\u nums[n+1]
理想情况下,我希望为path
、tri_num
和vol_list
实现此代码,其中包含数百项。我现在使用的方法意味着我需要手工制作数百个while循环。如何使while
循环同时工作,从而避免出现“数百个while循环”的情况
一切正常,但最终结果是:
[[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 10. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 25. 0.]
[ 0. 0. 0. 0. 0. 25.]
[ 0. 0. 0. 0. 0. 0.]]
这意味着vol\u list
的最终值(25
)尚未分配给array\u list[4][5]
,因此不在final\u array
中。它只需要再做一个循环就行了,但我不知道如何让它完成最后一个循环
如果有什么不清楚的地方,请告诉我
谢谢您错过数组的最后一个元素的原因是,您正在增加n
,同时从tri\u nums
中弹出元素。在while
循环的每次迭代开始时,查看n
和tri_nums
的值:
iteration n tri_nums n <= len(tri_nums)
0 0 [3, 2, 1] True
1 1 [2, 1] True
2 2 [1] False
也就是说,遍历列表、创建多个数组并将它们全部相加的整个方法是非常低效的。因为不是这样,所以我不会讨论所有的低效率问题,但有几个关键问题我想提一下:
- 您可以利用输入数据中的许多结构
- 您应该尽量使用Numpy矢量化操作,而不是本机Python操作
- 您一直将数字放在相同的索引上,因此您可以先将数字相加,然后只在最后创建数组
考虑到所有这些,我建议更改代码,使volu list
只包含每个数字一次
然后,您可以通过先将数字相加,然后将结果和粘贴到数组中来构造所需的数组。Numpy方便地包括cumsum
函数来计算数组的部分和:
>>> np.cumsum([10, 15, 25])
array([10, 25, 50])
它允许您在索引操作中同时指定多个值。因此,您的整个算法可以简化为:
final_array = np.zeros((6, 6))
final_array[paths[:-1], paths[1:]] = np.cumsum(vol_list)
如果长列表的内存需求出现问题,您可能希望将其用于存储,而不是普通的Numpy数组。list
是一种数据类型-不应将其用作变量名(重命名)而count<1:
是多余的,因为如果删除它,将得到相同的结果。只有当你以后想迭代不止一次时,才有必要保留它。任何你能用手做的事情都可以用电脑来做。想一想你会采取哪些步骤来手工完成。然后让电脑来做。有时要让计算机达到这个目标比较困难,但是YMMV。既然你问了,代码示例有点长,描述也比较复杂。我认为,如果将描述的各个部分与相应的代码片段穿插在一起,问题会更清楚。在几个地方添加示例输出将有助于进一步改进。话虽如此,我有点明白你在做什么;让我看看我是否能想出一个答案。另外,考虑到这可能是更好的位置(但如果是这样的话,它可以被迁移,不需要手动重新发布)。此外,现在我在看代码,有些事情没有意义。例如,每个while
循环都有细微的不同。例如,第一个循环在每次迭代时引用两个路径条目,即路径[n]
和路径[n+1]
,但其他循环每次引用一个路径条目。每个循环以不同的方式将其索引计算到volume\u数组中。第三个循环递增b
,但实际上并不在循环中的任何位置使用其值。这些是故意的不一致吗?为什么?这三个指数是什么<
vol_list = [10, 15, 25]
>>> np.cumsum([10, 15, 25])
array([10, 25, 50])
final_array = np.zeros((6, 6))
final_array[paths[:-1], paths[1:]] = np.cumsum(vol_list)