我正在尝试做一些简单的事情,但是我不明白由此产生的错误。我试过谷歌搜索操作数和广播(python 说这就是我在做的事情,但我做错了),但这对我没有帮助。我也找不到关于 SO 的答案,但也许我使用了错误的搜索词。
我有一个包含 64 个子列表的列表,其中有 64 个条目。我想创建一个新列表,其中每个子列表的条目都移到一侧(向前或向后,无关紧要),然后结束剪辑并用零填充开始,因此它仍然有 64 个条目。我以为我知道如何做到这一点,但我的解决方案不起作用,我不明白这个错误。它说我在广播,我做错了。然而,我只是做了一些列表理解(它们只是用于循环,对吗?)并将它们粘在一起。
目标:
1 2 3 4 5 1 2 3 4 5
1 2 3 4 5 0 1 2 3 4
1 2 3 4 5 becomes 0 0 1 2 3
1 2 3 4 5 0 0 0 1 2
1 2 3 4 5 0 0 0 0 1
我的尝试:
result = [ [[0 for hh in range(ii)]+originallist[0][jj][0+ii:] for ii in range(64)] for jj in range(64)]
(在 originallist 后面的额外 [0] 是因为我上面描述的列表实际上是一个母列表的子列表本身,但在这个例子中我只看一个这样的列表)
结果:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-51-5261c3ba129a> in <module>()
----> 1 result = [ [[0 for hh in range(ii)]+originallist[0][jj][0+ii:] for ii in range(64)] for jj in range(64)]
<ipython-input-51-5261c3ba129a> in <listcomp>(.0)
----> 1 result = [ [[0 for hh in range(ii)]+originallist[0][jj][0+ii:] for ii in range(64)] for jj in range(64)]
<ipython-input-51-5261c3ba129a> in <listcomp>(.0)
----> 1 result = [ [[0 for hh in range(ii)]+originallist[0][jj][0+ii:] for ii in range(64)] for jj in range(64)]
ValueError: operands could not be broadcast together with shapes (0) (64)
没有循环的例子
>>> a = np.arange(1,6)
>>> a
array([1, 2, 3, 4, 5])
我们现在有了所有的值,我们需要平铺。可能最好的方法是使用 np.tile
,但我们也可以在这里使用广播进行演示。
>>> b = np.ones(5,dtype=np.int)
>>> c = a*b[:,None] #Broadcasting the two together
>>> c
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]])
现在我们有了您的原始数组,我们需要对其进行操作以返回您想要的结果。
>>> c = c - np.arange(5)[:,None]
>>> c[c<0]=0
>>> c
array([[1, 2, 3, 4, 5],
[0, 1, 2, 3, 4],
[0, 0, 1, 2, 3],
[0, 0, 0, 1, 2],
[0, 0, 0, 0, 1]])
诚然,这是一个有限的例子。如果您可以发布 originallist
的示例,这可以得到改进。
检查您的代码,看起来 originallist
正在索引一个 numpy 数组。您收到此错误的原因是 +
运算符不会将列表和 numpy 数组附加在一起,而是尝试将它们相互广播。所以你正在做的是:
>>> range(0)
[]
>>> [] + np.arange(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (0) (3)
我想你想这样做:
>>> [] + np.arange(3).tolist()
[0, 1, 2]
我是一名优秀的程序员,十分优秀!