gpt4 book ai didi

python - 从向量化的二维数组中获取值

转载 作者:行者123 更新时间:2023-12-01 08:13:31 25 4
gpt4 key购买 nike

我在以下方面遇到了一些问题。我有一个 M x 2N 数组(解决方案)。我想获取这些值并将它们放入 N M x 2 数组中,每个数组存储在列表 masses 中的不同对象中。该代码不能依赖于所有循环,否则程序会非常慢。这是我的尝试:

        for i in range(len(masses)):
self.masses[i].l = solution[:len(solution)][2*i: 2*(i + 1)]

问题是,这只是获取整个解决方案数组并将其放入每个 l 数组中。知道为什么会发生这种情况吗?

举个例子,假设数组 masses 中有 3 个对象。 解决方案输入为

[[0,0,0,0,0,0]
[1,2,3,4,5,6]
[2,4,6,8,10,12]]

masses 中每个对象的 l 的预期值为:

self.masses[0].l = [[0,0]
[1,2]
[2,4]]


self.masses[1].l = [[0,0]
[3,4]
[6,8]]

self.masses[2].l = [[0,0]
[5,6]
[10,12]]

相反,每个l数组只是设置为solution数组。

最佳答案

您可以通过列表理解来做到这一点。它比普通循环更快。
我不知道 masses 中存储了哪些对象,因此为了这个示例,让我使用 masses 作为一个简单的列表。

solution = [[0,0,0,0,0,0], [1,2,3,4,5,6], [2,4,6,8,10,12]]

masses = [None] * 3 #I get that its length should be half of the length of the inner lists in solution.
for i in range(len(masses)):
masses[i] = [j[2*i:2*(i+1)] for j in solution]

print(masses)

质量是:

[
[[0, 0], [1, 2], [2, 4]],
[[0, 0], [3, 4], [6, 8]],
[[0, 0], [5, 6], [10, 12]]
]

这应该是你想要的。

猜测如何将它与您的masses列表一起使用,它应该是:

for i in range(len(masses)):
self.masses[i].l = [j[2*i:2*(i+1)] for j in solution]

只需确保 self.masses 列表中有足够的对象,否则您将收到 IndexError

评论后编辑

如果solution是一个Mx2N numpy数组,可以这样完成:

import numpy as np
solution = np.array([[0,0,0,0,0,0], [1,2,3,4,5,6], [2,4,6,8,10,12]])
masses = [solution[...,2*i:2*(i+1)] for i in range(int(solution.shape[1]/2))]

质量是:

[
array([[0, 0], [1, 2], [2, 4]]),
array([[0, 0], [3, 4], [6, 8]]),
array([[0, 0], [5, 6], [10, 12]])
]

正如我在评论中所说,如果您使用之前提到的列表理解,那么每个 masses 条目将是一维 numpy 数组的列表。现在,每个 masses 条目都是一个 2D numpy 数组。
我不确定效率,但尝试一下:numpy indexing相当快。
但是,如果您正在处理大量数据,那么在某些时候您只需要忍受它即可。优化存在限制。

在 OOP 设置中,您可能有一种方法来填充 self.masses 属性列表。它应该是这样的:

def setmasses(self, solution):
for i in range(int(solution.shape[1]/2)):
self.masses[i].l = solution[...,2*i:2*(i+1)]

恐怕在这种情况下没有简单的方法可以避免 for 循环,因为您需要循环遍历已存在的对象列表。

关于python - 从向量化的二维数组中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55088952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com