否定2D数组中的所有列表值

时间:2018-03-06 00:47:28

标签: python arrays python-3.x numpy list-comprehension

我的脚本的以下两个版本按预期工作:

matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]


def negate(amatrix):
    for alist in matrix:
        for i in range(len(alist)):
            alist[i] = -alist[i]
    return amatrix

print(negate(matrix))

收益率:[[-1,2,-3],[4,-5,6],[ - 7,8,-9]]

和这个版本一样:

matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]


def negate(amatrix):
    newmatrix = []
    for alist in amatrix:
        newlist = [-x for x in alist]
        newmatrix.append(newlist)
    return newmatrix

print(negate(matrix))

我正在尝试使用理解来更改值,就像第一个版本一样。

我有这个:

matrix = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]


def negate(amatrix):
    for alist in matrix:
        alist = [-x for x in alist]
    return amatrix

print(negate(matrix))

第三个版本确实否定了每个列表中的各个值,但更改未保存在矩阵中,即我希望列表值发生变化。

有没有办法使用理解来否定各个列表值,或者我是否必须使用索引版本(上面的第一个版本)?

1 个答案:

答案 0 :(得分:1)

列表推导不起作用。当您说x = [-i for i in x]时,会先评估右侧并分配给x。即使您将其分配给同一个变量,解决方案也不会就位。

您可能需要的是矢量化就地解决方案。这由numpy支持:

import numpy as np

arr = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])

arr *= -1

# array([[-1,  2, -3],
#        [ 4, -5,  6],
#        [-7,  8, -9]])