Как рассчитать декартово произведение двух массивов в NumPy?

Я хотел бы получить список 2d массивов NumPy (x, y), где каждый x находится в {-5, -4.5, -4, -3.5,..., 3.5, 4, 4.5, 5} и то же самое для y.

я мог бы сделать

x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)

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

Я хотел бы что-то обратно, что выглядит как:

[[-5, -5],
 [-5, -4.5],
 [-5, -4],
 ...
 [5, 5]]

но порядок не имеет значения.

Ответы

Ответ 1

Для этого вы можете использовать np.mgrid, он часто более удобен, чем np.meshgrid потому что он создает массивы за один шаг:

import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]

Для функциональности, подобной linspace, замените шаг (то есть 0.5) комплексным числом, величина которого указывает количество точек, которые вы хотите в серии. Используя этот синтаксис, определяются те же массивы, что и выше:

X, Y = np.mgrid[-5:5:21j, -5:5:21j]

Затем вы можете создать свои пары как:

xy = np.vstack((X.flatten(), Y.flatten())).T

Как предложил @ali_m, все это можно сделать в одну строку:

xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T

Удачи!

Ответ 2

Я думаю, вы хотите np.meshgrid:

Обратные координатные матрицы из векторов координат.

Сделать N-D координатные массивы для векторизованных оценок N-D скалярных/векторных полей над сетками N-D, учитывая одномерные координатные массивы x1, x2,..., xn.

import numpy as np
x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
X,Y = np.meshgrid(x,y)

вы можете преобразовать его в желаемый результат с помощью

XY=np.array([X.flatten(),Y.flatten()]).T

print XY
array([[-5. , -5. ],
       [-4.5, -5. ],
       [-4. , -5. ],
       [-3.5, -5. ],
       [-3. , -5. ],
       [-2.5, -5. ],
       ....
       [ 3. ,  5. ],
       [ 3.5,  5. ],
       [ 4. ,  5. ],
       [ 4.5,  5. ],
       [ 5. ,  5. ]])

Ответ 3

Мы можем использовать функцию аранжировки как:

z1 = np.array([np.array(np.arange(1,5)),np.array(np.arange(1,5))])
print(z1)
o/p=> [[1 2 3 4]
       [1 2 3 4]]

Ответ 4

Если вы просто хотите итерации по парам (а не выполнять вычисления всего набора точек сразу), вам может быть лучше всего itertools.product выполнить итерацию по всем возможным парам:

import itertools

for (xi, yi) in itertools.product(x, y):
    print(xi, yi)

Это позволяет избежать генерации больших матриц через meshgrid.

Ответ 5

Это именно то, что вы ищете:

matr = np.linspace((1,2),(10,20),10)

Это означает:

Для первого столбца; от 1 из (1,2) до 10 из (10,20), положите увеличивающиеся 10 чисел.

Для второго столбца; от 2 из (1,2) до 20 из (10,20), вставьте 10 чисел.

И результат будет:

[[ 1.  2.]
 [ 2.  4.]
 [ 3.  6.]
 [ 4.  8.]
 [ 5. 10.]
 [ 6. 12.]
 [ 7. 14.]
 [ 8. 16.]
 [ 9. 18.]
 [10. 20.]]

Вы также можете сохранить увеличение только одного значения столбца, например, если вы скажете, что:

matr = np.linspace((1,2),(1,20),10)

Первый столбец будет от 1 из (1,2) до 1 из (1,20) в течение 10 раз, что означает, что он останется как 1, и результат будет:

[[ 1.  2.]
 [ 1.  4.]
 [ 1.  6.]
 [ 1.  8.]
 [ 1. 10.]
 [ 1. 12.]
 [ 1. 14.]
 [ 1. 16.]
 [ 1. 18.]
 [ 1. 20.]]

Ответ 6

Не уверен, что я понимаю вопрос - чтобы составить список 2-элементных массивов NumPy, это работает:

import numpy as np
x = np.arange(-5, 5.1, 0.5)
X, Y = np.meshgrid(x, x)
Liszt = [np.array(thing) for thing in zip(X.flatten(), Y.flatten())] # for python 2.7

zip дает вам список кортежей, а остальное - все остальные.

Ответ 7

На основе этого примера вы можете сделать любой тусклый

def linspace3D(point1,point2,length):
    v1 = np.linspace(point1[0],point2[0],length)
    v2 = np.linspace(point1[1],point2[1],length)
    v3 = np.linspace(point1[2],point2[2],length)
    line = np.zeros(shape=[length,3])
    line[:,0]=v1
    line[:,1]=v2
    line[:,2]=v3
    return line