Во-первых, вы не должны использовать Numpy массивы как списки списков.
Во-вторых, давайте забудем о NumPy; ваш listcomp не имеет никакого смысла в первую очередь, даже для списков списков.
Во внутреннем понимании, for i in X
будет перебирать строки в X. Эти строки не являются числами, они перечислены (или, в NumPy, 1D массивов), так X[i]
не имеет никакого смысла. Возможно, вам понадобилось i[j]
.
По внешнему пониманию, for j in X[i]
имеет ту же проблему, но имеет еще большую проблему: нет значения i
. У вас есть понимание зацикливания над каждым i
внутри это понимание.
Если вы смущены постижению, записать его в качестве явного for
заявления, как описано в разделе учебника по List Comprehensions:
tmp = []
for j in X[i]:
tmp.append([X[i,j] for i in X])
... который расширяется:
tmp = []
for j in X[i]:
tmp2 = []
for i in X:
tmp2.append(X[i,j])
tmp.append(tmp2)
... что должно сделать очевидным, что здесь не так.
Я думаю, что ты хотел:
[[cell for cell in row] for row in X]
Снова включите его в явные for
заявления:
tmp = []
for row in X;
tmp2 = []
for cell in row:
tmp2.append(cell)
tmp.append(tmp2)
Очевидно, что это правильно.
Или, если вы действительно хотите использовать индексацию (но не):
[[X[i][j] for j in range(len(X[i]))] for i in range(len(X))]
Итак, вернемся к NumPy.С точкой зрения NumPy, что последняя версия:
[[X[i,j] for j in range(X.shape[1])] for i in range(x.shape[0])]
... и если вы хотите идти в столбцах порядка вместо строки-майор, вы можете (в отличие от списка списков):
[[X[i,j] for i in range(X.shape[0])] for j in range(x.shape[1])]
... но это, конечно же, перенесет массив, который вы не хотите делать.
Единственное, что вы, , не может делать, смешивать колонку-майор и порядок строк в том же самом выражении, потому что в итоге вы получаете ерунду.
Конечно путь право сделать копию массива использовать copy
метод:
X.copy()
Подобно тому, как правильно транспонировать массив:
X.T
X [I, J] является синтаксически X [I] [J] в NumPy –
Не делайте этого! Это поражает всю цель использования NumPy. – user2357112
И (даже если вы его исправите), это не приведет к воспроизведению массива, вместо этого будет создан список списков. – abarnert