I ein Problem dahingehend zu lösen, dass, wenn ich ein Element in einer MxN-Matrix gleich 0 ist, seine gesamte Zeile und Spalte auf 0.maximaler Bit zu speichern, in einzelner ganzen Zahl Python variable
eingestellt werden zuerst zwei Variablen zero_row und zero_col werden eingeführt, um die Zeilen und Spalten zu speichern, die auf 0 gesetzt werden müssen. Als nächstes wiederhole ich die Elemente in der Matrix, setze den Bit-Offset der Zeile in zero_row und den Bit-Offset der Spalte in zero_col auf 1, wenn das Element gleich 0 ist. Dann gehe ich die Matrix erneut durch und setze jede Zeile und Spalte auf Null, wenn die Bitoffsets in zero_row und zero_col auf 1 gesetzt sind.
zero_row und zero_col werden anfangs auf 0 gesetzt. Also nehme ich an, es ist ein Integer-Typ. Ich arbeite an einem 64-Bit-Computer. Daher dachte ich, das maximale Bit, das ich setzen könnte, ist 64 Bit (pro Integer). Ich bin neugierig, warum der Code mit einem Array von 3x144 immer noch richtig funktioniert. Die Spaltengröße 144 Bit ist offensichtlich größer als 64 Bit ... Führt Python automatisch "Typcasting" durch? oder vielleicht kann mich irgendjemand auf die Dokumentationen hinweisen, die das Grundlegende erklären. Vielen Dank.
import numpy
class Matrix:
def __init__(self):
pass
def check_matrix(self, input_mat):
zero_row = 0
zero_col = 0
for row in xrange(len(input_mat)):
for col in xrange(len(input_mat[row])):
if zero_row >> row & 1 == 0 or zero_col >> col & 1 == 0:
if input_mat[row][col] == 0:
zero_row = zero_row | 1 << row
zero_col = zero_col | 1 << col
return [zero_row, zero_col]
def set_matrix(self, input_mat, zero_row, zero_col):
for row in xrange(len(input_mat)):
for col in xrange(len(input_mat[row])):
if (zero_row >> row) & 1 == 1 or (zero_col >> col) & 1 == 1:
input_mat[row][col] = 0
return input_mat
m = Matrix()
# input_arr = numpy.array([[1,1,1], [2, 0, 2], [3, 3, 3]])
# input_arr = numpy.array([[1,1,1], [2, 2, 2], [0, 3, 0]])
input_arr = numpy.array([
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,3,0]
])
[zero_row, zero_col] = m.check_matrix(input_arr)
print bin(zero_row), " ", bin(zero_col)
print m.set_matrix(input_arr, zero_row, zero_col)
Ergebnisse:
0b100 0b101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0]
[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 2 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
siehe [diese Frage] (http://stackoverflow.com/q/7604966/1274789) – Pedru