从矢量化的二维数组中获取值

2024-10-01 09:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在以下方面遇到了一些问题。我有一个mx2n数组(solution)。我想将这些值放入nmx2数组中,每个数组存储在列表masses中的不同对象中。代码不能依赖于所有循环,否则程序会非常慢。以下是我的尝试:

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

问题是,这只需要将整个解决方案数组放入每个l数组中。你知道为什么会这样吗

例如,假设数组masses中有3个对象。solution输入是

[[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数组


Tags: 对象代码inself程序列表forlen
1条回答
网友
1楼 · 发布于 2024-10-01 09:41:47

你可以用列表来理解。它比普通环路快。
我不知道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)

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))]

masses是:

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

正如我在评论中所说的,如果使用前面提到的列表理解,但是每个masses条目将是一个1dnumpy数组的列表。现在每个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循环,因为您需要在已经存在的对象列表上循环

相关问题 更多 >