2

我正在尝试做一些简单的事情,但是我不明白由此产生的错误。我试过谷歌搜索操作数和广播(python 说这就是我在做什么,我做错了),但这对我没有帮助。我也找不到关于 SO 的答案,但也许我使用了错误的搜索词。

我有一个包含 64 个条目的 64 个子列表的列表。我想创建一个新列表,其中每个子列表的条目都移动到一侧(向前或向后,没关系),然后结束剪辑并用零填充开头,因此它仍然有 64 个条目。我以为我知道该怎么做,但我的解决方案不起作用,我不明白错误。它说我正在广播并且我做错了。但是,我只是做了一些列表理解(这只是 for 循环,对吗?)并将它们粘在一起。

目标:

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

3 回答 3

1

以下应该做你需要的?

l1 = [[1,2,3],[4,5,6],[7,8,9]]
l2 = []
for i,l in enumerate(l1):
    t=[]

    for j in range(len(l)):
        if(j<i):
            t.append(0)
        else:
            t.append(l[j-i])
    l2.append(t)
print l2
# gives: [[1, 2, 3], [0, 4, 5], [0, 0, 7]]

你想做的是把这些东西写成一个单行者吗?就个人而言,如果它看起来像这样,我更喜欢它,因为它显示了它是如何工作的,而 oneliners 可能在你编程的那一刻对你来说很清楚,但如果你在一个月后回顾它们,你必须再次弄清楚如何它的工作原理是它可以做你想做的事情,而如果你把它分成多行,它就更不言自明了

于 2013-10-17T11:32:12.577 回答
1

没有循环的例子

>>> 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]
于 2013-10-17T12:59:44.230 回答
1

只是另一种解决方案,一个快速的单线:

>>> l1 = [[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]]
>>> [([0]*pos)+l[:len(l1)-pos] for pos, l in enumerate(l1)]
[[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]]
于 2013-10-17T16:29:16.817 回答