如果所有行都至少包含一个负元素,则更改矩阵中元素的符号

Change the signs of the elements in a matrix if all rows contain at least one negative element

我想检查矩阵的所有行是否至少包含一个负元素。如果是,改变矩阵所有元素的符号。

这是我的尝试,但这种方法只是改变了负数元素的符号:

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

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if matrix[i][j] < 0:
             print(matrix[i][j]*(-1))

编辑:

所以首先你可以检查矩阵是否包含至少一个负元素,然后改变所有元素的符号。

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

hasNegativeElement = False

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if matrix[i][j] < 0:
            hasNegativeElement = True
            break

if hasNegativeElement:
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            matrix[i][j] *= (-1)

你可以用 numpy 轻松做到:

import numpy as np
In [108]: np.array(matrix) * -1
Out[108]: 
array([[-5,  6, -2],
       [-7, -2, -3],
       [-8, -4,  9]])

或者如果你想在最后列出一个列表,你可以使用 tolist 方法:

In [124]: (np.array(matrix) * -1).tolist()
Out[124]: [[-5, 6, -2], [-7, -2, -3], [-8, -4, 9]]

试试这个:

allRowsNegative = True;
for i in range(len(matrix)):
    foundNegative = False;
    for j in range(len(matrix[i])):
        foundNegative = (foundNegative or matrix[i][j] < 0);
    allRowsNegative = (allRowsNegative and foundNegative);

if allRowsNegative:
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            print(matrix[i][j]*(-1));
else:
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            print(matrix[i][j]);

非 numpy 解决方案:

>>> matrix = [[5, -6, 2], [7, -2, 3], [8, 4, -9]]
>>> if all(any(x < 0 for x in sub) for sub in matrix):
...     result = [[-x for x in sub] for sub in matrix]
... 
>>> result
[[-5, 6, -2], [-7, 2, -3], [-8, -4, 9]]

numpy解决方案

>>> import numpy as np
>>> matrix = [[5, -6, 2], [7, -2, 3], [8, 4, -9]]
>>> m_arr = np.array(matrix)
>>> if np.all(np.any(m_arr < 0, axis=1)):
...     result = (m_arr*(-1)).tolist()
... 
>>> result
[[-5, 6, -2], [-7, 2, -3], [-8, -4, 9]]

您可以使用 np.any 检查每一行是否有负元素,这会给出一个数组,然后您可以通过 np.all 检查是否所有行都具有负元素。如果是则反转矩阵的符号。

import numpy as np
A = np.array([[5, -6, 2], [7, 2, 3], [8, 4, -9]])

if np.all(np.any(A<0,axis=1)):
    A *= -1

我想到的最简单的方法:

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

for i in range(len(m)):
    flag = False
    for y in m[i]:
        if(y<0):
            flag = True
            break
    if (flag == True):
        for j in range(len(m[i])):
            m[i][j] = -1 * m[i][j]


print (m)           # [[-5, 6, -2], [-7, 2, -3], [-8, -4, 9], [2, 4, 6]]

检查所有行是否包含负数的好方法(假设您的矩阵至少为 1x1,不为空):

   max(map(min, matrix)) < 0

总的来说:

if max(map(min, matrix)) < 0:
    matrix[:] = [[-x for x in row] for row in matrix]