Преобразование матрицы в кортеж python

#python #numpy #matrix #tuples

#python #numpy #матрица #кортежи

Вопрос:

У меня есть матрица с именем w, и она выглядит так:

 in:  print(w)
out: [[0.0053691  0.00328692]]
 

он имеет тип <класс ‘numpy.matrix’>

 in:  print(type(w))
out: <class 'numpy.matrix'>
 

Я хочу, чтобы это был кортеж, но простой w = tuple(w) не выполняет выполненную работу:

 in:  w=tuple(w)
in:  print(w)
out: (matrix([[0.00624969, 0.00413867]]),)
 

Но я хочу, чтобы вывод был таким:

 in:  print(w)
out: (0.00624969, 0.00413867)
 

Что я делаю не так?

Ответ №1:

У вас есть двумерная вещь.

Вы можете создать список, например

 >>> w.tolist()
[[0.0053691, 0.00328692]]
 

что, вероятно, достаточно хорошо. Если вы действительно хотели извлечь тульпу из внутренней части

 >>> tuple(w.tolist()[0])
(0.0053691, 0.00328692)
 

Комментарии:

1. @mdurant, возможно, вы знаете что-то, чего я не знаю, но есть ли какая-либо разница или преимущество в использовании вашего решения вместо моего?

2. Это тоже хорошо и более компактно — возможно, менее понятно. Я подозреваю, что для любого массива, состоящего из более чем одного элемента, итерация будет медленнее.

3. @PabloC, tolist это самый быстрый способ «извлечь» массив numpy (или np.matrix ) в списки. *w распаковка похожа list(w) на итерацию по первому измерению w и обычно медленнее. Плюс для этого w первым измерением является размер 1.

Ответ №2:

Вы «сохраняете» матрицу в кортеж, а не преобразуете ее. Вы можете сделать следующее

 tuple(*w.A)
#(0.00624969, 0.00413867)
 

Звездное выражение ( *w.A ) распаковывает внешнее измерение значений массива путем итерации. Подробнее читайте здесь.

Комментарии:

1. Но если w is np.matrix , в отличие от 1d ndarray , это не сработает.