2015-05-21 3 views
5

Я оцениваю произвольные выражения в терминах массива x, например 3 * x ** 2 + 4. Это обычно приводит к массиву с формой x. Однако, если выражение является просто константой, оно возвращает скаляр. Каков наилучший способ убедиться, что он имеет форму x без явной проверки формы? Умножение на numpy.ones (x.shape) работает, но я думаю, что использует ненужные вычисления.Numpy конвертировать скаляры в массивы

Edit: Чтобы было ясно, я не хочу, чтобы это было массив размером один, я хочу, чтобы это было такой же формы и размера, как X. Я оценки строку, используя NumExpr, который может содержит произвольную функцию х:

x = numpy.linspace(min, max, num) 
y = numexpr.evaluate(expr, {'x': x}, {}) 

Я хочу, чтобы получить массив у значений, которые могут быть нанесены на крестик через Matplotlib. В настоящее время я делаю это, что отлично работает:

y = numpy.ones(x.size) * y 

Но я беспокоюсь, что это бесполезно для больших размеров. Есть ли способ лучше?

+0

Я думаю, что я следую за то, что вы имеете в виду, но вы должны включать в себя минимальный, из конца в конец кода, чтобы быть Чисто. – J0e3gan

ответ

4

Когда я не уверен, будет ли х скаляр, список/кортеж или массив, я использую:

x = np.asarray(x).reshape(1, -1)[0,:] 

Альтернативно с помощью (AB) с использованием правил вещания, вы могли бы одинаково написать:

x = np.asarray(x) * np.ones(1) 

Возможно немного более обтекаемый синтаксис использовать дополнительные аргументы в конструкторе массива:

x = np.array(x, ndmin=1, copy=False) 

Это гарантирует, что массив имеет хотя бы одно измерение.

Но это одна из тех вещей, что кажется немного неуклюжим в NumPy

+0

не могли бы вы объяснить, почему вы предлагаете использовать 'copy = False'. Используете ли вы его, если знаете, что 'x' является скаляром? –

3

См atleast_1d:

Преобразование входов в массивы, по крайней мере, в одном измерении.

>>> import numpy as np 
>>> x = 42 # x is a scalar 
>>> np.atleast_1d(x) 
array([42]) 

>>> x_is_array = np.array(42) # A zero dim array 
>>> np.atleast_1d(x_is_array) 
array([42]) 

>>> x_is_another_array = np.array([42]) # A 1d array 
>>> np.atleast_1d(x_is_another_array) 
array([42]) 

>>> np.atleast_1d(np.ones((3, 3))) # Any other numpy array 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
+0

Это было давно, но, как я упоминал в вопросе, я хотел, чтобы выходной массив имел тот же размер, что и входной массив. Я думаю, что в итоге я назначил его представлению о заданном массиве типа 'out [:] = y'. –

0

Вы можете использовать Reshape: np.reshape(x, (1,1))

Вот демонстрация:

>>> x = 4 
>>> a = np.reshape(x, (1,1)) 
>>> a[0] 
array([4]) 
>>> a[0][0] 
Смежные вопросы