Сформировать массив numpy из возможного массива numpyPython

Программы на Python
Anonymous
Сформировать массив numpy из возможного массива numpy

Сообщение Anonymous »

РЕДАКТИРОВАТЬ

Я понял, что не очень хорошо проверил свой mwe и поэтому задал неправильный вопрос. Основная проблема заключается в том, что массив numpy передается как массив 2d вместо 1d (или даже когда список Python передается как 1d вместо 2d). Итак, если у нас есть

Код: Выделить всё

x = np.array([[1], [2], [3]])
тогда, очевидно, если вы попытаетесь проиндексировать это, вы получите массивы (если вы используете элемент, которого нет). то же самое относится и к стандартным спискам Python.

Извините за путаницу.

Оригинал

Я пытаюсь сформировать новый массив numpy из чего-то, что может быть массивом numpy или стандартным списком Python.

например

Код: Выделить всё

import numpy as np

x = [2, 3, 1]

y = np.array([[0, -x[2], x[1]], [x[2], 0, -x[0]], [-x[1], x[0], 0]])
Теперь я хотел бы сформировать функцию, чтобы я мог легко сделать y.

Код: Выделить всё

def skew(vector):
"""
this function returns a numpy array with the skew symmetric cross product matrix for vector.
the skew symmetric cross product matrix is defined such that
np.cross(a, b) = np.dot(skew(a), b)

:param vector: An array like vector to create the skew symmetric cross product matrix for
:return: A numpy array of the skew symmetric cross product vector
"""

return np.array([[0, -vector[2], vector[1]],
[vector[2], 0, -vector[0]],
[-vector[1], vector[0], 0]])
Это отлично работает, и теперь я могу писать (при условии, что указанная выше функция включена)

Код: Выделить всё

import numpy as np

x=[2, 3, 1]

y = skew(x)
Однако я также хотел бы иметь возможность вызывать skew для существующих одномерных или двухмерных массивов. Например

Код: Выделить всё

import numpy as np

x = np.array([2, 3, 1])

y = skew(x)
К сожалению, при этом возвращается массив numpy, элементы которого также являются массивами numpy, а не числами с плавающей запятой Python, как мне хотелось бы.

Есть ли простой способ сформировать новый массив numpy, как я это сделал, из чего-то, что представляет собой либо список Python, либо массив numpy, и получить в результате просто стандартный массив numpy с числами с плавающей запятой в каждом элементе?

Теперь, очевидно, одно из решений — проверить, является ли ввод пустым массивом или нет:

Код: Выделить всё

def skew(vector):
"""
this function returns a numpy array with the skew symmetric cross product matrix for vector.
the skew symmetric cross product matrix is defined such that
np.cross(a, b) = np.dot(skew(a), b)

:param vector: An array like vector to create the skew symmetric cross product matrix for
:return: A numpy array of the skew symmetric cross product vector
"""
if isinstance(vector, np.ndarray):
return np.array([[0, -vector.item(2), vector.item(1)],
[vector.item(2), 0, -vector.item(0)],
[-vector.item(1), vector.item(0), 0]])
else:
return np.array([[0, -vector[2], vector[1]],
[vector[2], 0, -vector[0]],
[-vector[1], vector[0], 0]])
Однако писать эти проверки экземпляров повсюду становится очень утомительно.

Другим решением может быть сначала привести все к массиву, а затем просто использовать вызов массива

Код: Выделить всё

def skew(vector):
"""
this function returns a numpy array with the skew symmetric cross product matrix for vector.
the skew symmetric cross product matrix is defined such that
np.cross(a, b) = np.dot(skew(a), b)

:param vector: An array like vector to create the skew symmetric cross product matrix for
:return: A numpy array of the skew symmetric cross product vector
"""

vector = np.array(vector)

return np.array([[0, -vector.item(2), vector.item(1)],
[vector.item(2), 0, -vector.item(0)],
[-vector.item(1), vector.item(0), 0]])
но мне кажется, что это неэффективно, поскольку требует создания новой копии вектора (в данном случае это не имеет большого значения, поскольку вектор небольшой, но это всего лишь простой пример) ).

Мой вопрос: есть ли другой способ сделать это помимо того, что я обсуждал, или я застрял в использовании одного из этих методов?

Подробнее здесь: https://stackoverflow.com/questions/369 ... umpy-array

Вернуться в «Python»