对具有不等长度子列表的数组应用简单操作

时间:2016-01-02 03:50:03

标签: python arrays numpy

我有两个长度不等的子列表:

SELECT A.id, 
       A.accnt, 
       A.amount, 
       Sum(I.issued) AS issued 
FROM   accnttbl A
       LEFT JOIN issuedtbl I
              ON A.id = I.id 
                 AND Month(I.dateissue) BETWEEN 1 AND 2 -- Right table filter
WHERE  Year(A.date) = 2016 
GROUP  BY A.id, 
          A.accnt, 
          A.amount 

我需要将所有元素除以10,所以我可以将a = [[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]] 转换为a数组,然后应用这样的操作:

numpy

但结果是:

np.asarray(a) / 10.

我可以这样做:

TypeError: unsupported operand type(s) for /: 'list' and 'float'

但我很确定这不是pythonic的方法。

对由不同长度的子列表组成的数组应用操作的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

您需要numpy吗?否则你可以使用简单的列表理解:

b = [map(lambda x:x/10, i) for i in a]

答案 1 :(得分:1)

我喜欢它的外观:

In [273]: [(np.array(i)/10).tolist() for i in a]
Out[273]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]

简单地将a转换为数组并不好,因为它将元素(其中2个)留作列表。

In [275]: np.array(a)
Out[275]: array([[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]], dtype=object)

dtype=object数组只不过是带有数组包装器的列表。因此,如果要使用数组除法,则需要将子列表转换为数组。

但纯粹的列表理解版本看起来更清晰 - 更加pythonic:

In [279]: [[j/10. for j in i] for i in a]
Out[279]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]

在我的书中,列表推导非常“pythonic”;嵌套的更是如此。 :)不必要地使用numpy是非pythonic,特别是如果之后需要tolist

dtype=object数组尝试将操作应用于每个元素,例如

np.array(a)/10 => np.array([i/10 for i in a])

它不适用于子列表情况,因为未定义[2,3]/10

但是如果我们采取额外步骤将子列表转换为数组:

In [282]: aa=np.array([np.array(i) for i in a])

In [283]: aa/10.
Out[283]: array([array([ 0.02,  0.03]), array([ 0.06,  0.05,  0.07,  0.08])], dtype=object)

然后阵列分工工作。但是,不要指望这项工作适用于所有操作。 dtype=object数组代码尚未完全开发。

答案 2 :(得分:0)

如果您需要直接修改现有列表,可以执行此操作。

for i1, l in enumerate(a):
    for i2, _ in enumerate(l):
        a[i1][i2] /= 10