Python 在NumPy矩阵列表上迭代

Python 在NumPy矩阵列表上迭代,python,numpy,for-loop,matrix,iterable-unpacking,Python,Numpy,For Loop,Matrix,Iterable Unpacking,我有一个列有行矩阵的列表: rows = [ matrix([[1, 0, 0]]), matrix([[0, 1, 0]]), matrix([[0, 0, 1]]) ] 我尝试在a、b、c行中循环这些,但没有成功,而是出现了一个错误: ValueError: not enough values to unpack (expected 3, got 1) 不幸的是,这在[1,0,0]上有效,但在[[1,0,0]]上无效 我意识到这是因为它们是[[双重包装]],但我想知道是否有一个简单的解决方

我有一个列有行矩阵的列表:

rows = [ matrix([[1, 0, 0]]), matrix([[0, 1, 0]]), matrix([[0, 0, 1]]) ]
我尝试在a、b、c行中循环这些,但没有成功,而是出现了一个错误:

ValueError: not enough values to unpack (expected 3, got 1) 不幸的是,这在[1,0,0]上有效,但在[[1,0,0]]上无效


我意识到这是因为它们是[[双重包装]],但我想知道是否有一个简单的解决方案来解决这个问题?

似乎您想要解压每个矩阵本身。在这种情况下,我建议:不要使用矩阵或NumPy。也没有理由使用NumPy矩阵。即使是您应该更喜欢数组而不是矩阵的状态。但是在这种情况下,您应该使用普通列表,如果您对它们进行迭代或解压缩,它们会更快

因此,首先要迭代每个矩阵,然后要解压缩其中的每个矩阵。但你必须分两步来做:

for mat in rows:      # this iterates over the list and gives you each matrix
    # this unpacks the matrix
    # to make it work faster I converted it to a list first using "tolist"
    # note that I needed to index it because it's a 2D matrix!
    a, b, c = mat.tolist()[0]
    print(a, b, c)  
也可以在一行中执行两个步骤:

for a, b, c in (mat.tolist()[0] for mat in rows):
    print(a, b, c)

似乎您希望将每个矩阵本身解包。在这种情况下,我建议:不要使用矩阵或NumPy。也没有理由使用NumPy矩阵。即使是您应该更喜欢数组而不是矩阵的状态。但是在这种情况下,您应该使用普通列表,如果您对它们进行迭代或解压缩,它们会更快

因此,首先要迭代每个矩阵,然后要解压缩其中的每个矩阵。但你必须分两步来做:

for mat in rows:      # this iterates over the list and gives you each matrix
    # this unpacks the matrix
    # to make it work faster I converted it to a list first using "tolist"
    # note that I needed to index it because it's a 2D matrix!
    a, b, c = mat.tolist()[0]
    print(a, b, c)  
也可以在一行中执行两个步骤:

for a, b, c in (mat.tolist()[0] for mat in rows):
    print(a, b, c)

一个问题是,索引一行矩阵仍然会得到一个矩阵。一种解决方法是将矩阵转换为一维数组:

In [368]: for r in rows:
     ...:     a,b,c=r.A1
     ...:     print(a,b,c)
     ...:     
1 0 0
0 1 0
0 0 1
我通常不使用或建议从数组中解包值。这与数组的通用性背道而驰。解包,除非使用“*”术语修复尺寸。但在一般情况下,数组可以有多个维度和大的尺寸


也不鼓励使用np.matrix。如果这些元素是np.array,那么就不会有这个持久的2d问题。

一个问题是索引一行矩阵仍然会得到一个矩阵。一种解决方法是将矩阵转换为一维数组:

In [368]: for r in rows:
     ...:     a,b,c=r.A1
     ...:     print(a,b,c)
     ...:     
1 0 0
0 1 0
0 0 1
我通常不使用或建议从数组中解包值。这与数组的通用性背道而驰。解包,除非使用“*”术语修复尺寸。但在一般情况下,数组可以有多个维度和大的尺寸

也不鼓励使用np.matrix。如果这些元素是np.array,那么就不会有这个持久的2d问题。

因为我们使用a、b、c从每个矩阵的第一行提取元素,似乎我们保证每行有3个元素,并且每一个矩阵每行有一个元素。因此,一个简单的解决方案是在使用循环时使用数组构造函数并挤出单例嵌套级别,如下所示-

for a,b,c in np.array(rows)[:,0]:
或者更简单的np-

请注意,这并不是内存效率最高的方法,而是提取所需标量值的简单方法

这是一个运行示例-

In [375]: for a,b,c in np.squeeze(rows):
     ...:     print(a,b,c)
     ...:     
(1, 0, 0)
(0, 1, 0)
(0, 0, 1)
由于我们使用a、b、c从每个矩阵的第一行提取元素,因此似乎我们保证每行有3个元素,并且对于这些矩阵中的每一个,每行有一个元素。因此,一个简单的解决方案是在使用循环时使用数组构造函数并挤出单例嵌套级别,如下所示-

for a,b,c in np.array(rows)[:,0]:
或者更简单的np-

请注意,这并不是内存效率最高的方法,而是提取所需标量值的简单方法

这是一个运行示例-

In [375]: for a,b,c in np.squeeze(rows):
     ...:     print(a,b,c)
     ...:     
(1, 0, 0)
(0, 1, 0)
(0, 0, 1)

还请包括预期行为,请参见。否则很难准确回答您的问题..在numpy数组/矩阵上使用for循环有什么原因吗?您是在首先创建此列表吗?@MSeifert我很抱歉,我认为这是显而易见的,但我想我应该把它说得更清楚,所以我添加了一个示例@roganjosh我迭代行矩阵中的值;这些都是长度为3的,因此只需将值解包到a、b、c就可以了。我已经创建了矩阵列表。谢谢您的编辑。现在确实更清楚了还请包括预期行为,请参见。否则很难准确回答您的问题..在numpy数组/矩阵上使用for循环有什么原因吗?您是在首先创建此列表吗?@MSeifert我很抱歉,我认为这是显而易见的,但我想我应该把它说得更清楚,所以我添加了一个示例@roganjosh我迭代行矩阵中的值;这些都是长度为3的,因此只需将值解包到a、b、c就可以了。我已经创建了矩阵列表。谢谢您的编辑。现在确实更清楚了虽然我欣赏它的优雅,但这太糟糕了。您将矩阵列表转换为数组,只是为了用for循环对其进行迭代?还要注意,问题使用了f字符串,因此答案至少应该是打印的:@MSeifert正如我所说,我更倾向于问题中所述的简单解决方案部分。同意,这个内存效率不高:Inef
各方面都很有效率,但很简单——我承认这一点。解压数组或迭代数组要慢得多。仅对3种方法进行计时;我的:20us,hpaulj:35us,你的:67us.np。挤压似乎是将原始代码转化为工作解决方案的最简单方法。内存不重要,因为列表相对较小,但这确实是一个有效点。但既然没有优化标签,那就不太重要了。虽然我欣赏它的优雅,但这太糟糕了。您将矩阵列表转换为数组,只是为了用for循环对其进行迭代?还要注意,问题使用了f字符串,因此答案至少应该是打印的:@MSeifert正如我所说,我更倾向于问题中所述的简单解决方案部分。同意,这一个不是很有内存效率:在各个方面都效率很低,但很简单——我承认这一点。解压数组或迭代数组要慢得多。仅对3种方法进行计时;我的:20us,hpaulj:35us,你的:67us.np。挤压似乎是将原始代码转化为工作解决方案的最简单方法。内存不重要,因为列表相对较小,但这确实是一个有效点。但既然没有优化标签,那就不太重要了。我很感激你的关注,但是列表是矩阵乘法的结果。您的解决方案的速度令人印象深刻,我喜欢单线解决方案,即使它有点不直观。我感谢您的关注,但列表是矩阵乘法的结果。您的解决方案的速度令人印象深刻,我喜欢单线解决方案,即使它有点不直观。