Вы должны использовать Задачи. Если вы выполняете длительную операцию при нажатии кнопки, вы блокируете поток пользовательского интерфейса JavaFX. Взгляните сюда: https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm
np.size()
, без оси, дает вам общее количество элементов в матрице. Таким образом, ваши range()
будут идти от 0 до 8, а не от 0 до 2.
Вам не нужно использовать np.size()
или np.shape()
в этом отношении; Эти функции даже не перечислены в документации. Просто используйте атрибут .shape
матрицы:
y = np.zeros(x.shape)
for i in range(x.shape[0]):
for j in range(x.shape[1]):
Существуют более эффективные способы получения выходных данных. Вместо этого вы можете использовать:
def symmetrize(x):
return x + x.T - np.diag(x.diagonal())
. x.T
- это транспонированная матрица , поэтому строки и столбцы меняются местами. x + x.T
является суммой исходной матрицы и матрицы транспонирования, поэтому числа на диагонали удваиваются. x.diagonal()
- это массив только тех чисел на диагонали, которые можно вычесть, как только вы создали матрицу из этих чисел на диагонали, что и делает np.diag()
для вы.
Вы используете np.size()
неправильно, он не сообщает вам, сколько строк или столбцов в вашем списке, но количество элементов в массиве, в вашем случае - 9
. Вы можете использовать форму вашего списка следующим образом:
def symmetrize(x):
## The symmetrized matrix that is returned
y = np.zeros(np.shape(x))
## For loop for each element (i,j) in the matrix
for i in range(x.shape[0]):
for j in range(x.shape[1]):
if i == j:
y[i,j] = x[i,j]
else:
y[i,j] = x[i,j] + x[j,i]
return y