создание 2D массива координат пути из 1d массивов - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь сгенерировать массив координат из 1d-списков позиций X Y Z. Программное обеспечение, которое я использую, выполняет итерации по каждому списку, которые располагаются в определенном порядке приоритета. Другими словами, если у меня есть x = [x0, x1], y = [y0, y1] и z = [z0, z1] и если приоритет равен z> y> x, соответствующий массив будет:

x0 y0 z0
x0 y0 z1
x0 y1 z0
x0 y1 z1
x1 y0 z0
x1 y0 z1
x1 y1 z0
x1 y1 z1

Я пытался использовать списочные выражения, однако ввод - 1d ndarrays, а не списков, что требует от меня преобразования данных в списки, а затем обратно обратно в ndarray (в некоторых случаях я также пытаюсь использовать гибкие списки) реализовать). Есть ли в numpy функции, которые могут помочь сгенерировать такой массив?

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
out = [[i, j, k] for i in x for j in y for k in z]
out = np.asarray(out)

выход

[[1, 4, 7],
 [1, 4, 8],
 [1, 4, 9],
 [1, 5, 7],
 [1, 5, 8],
 [1, 5, 9],
 [1, 6, 7],
 [1, 6, 8],
 [1, 6, 9],
 [2, 4, 7],
 [2, 4, 8],
 [2, 4, 9],
 [2, 5, 7],
 [2, 5, 8],
 [2, 5, 9],
 [2, 6, 7],
 [2, 6, 8],
 [2, 6, 9],
 [3, 4, 7],
 [3, 4, 8],
 [3, 4, 9],
 [3, 5, 7],
 [3, 5, 8],
 [3, 5, 9],
 [3, 6, 7],
 [3, 6, 8],
 [3, 6, 9]]

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Попробуйте это.

np.array(np.meshgrid(x,y,z)).T.reshape(-1,3)

ВЫХОД:

[[1 4 7]
 [1 5 7]
 [1 6 7]
 [2 4 7]
 [2 5 7]
 [2 6 7]
 [3 4 7]
 [3 5 7]
 [3 6 7]
 [1 4 8]
 [1 5 8]
 [1 6 8]
 [2 4 8]
 [2 5 8]
 [2 6 8]
 [3 4 8]
 [3 5 8]
 [3 6 8]
 [1 4 9]
 [1 5 9]
 [1 6 9]
 [2 4 9]
 [2 5 9]
 [2 6 9]
 [3 4 9]
 [3 5 9]
 [3 6 9]]
0 голосов
/ 04 мая 2019

Да, вы можете использовать np.repeat и np.tile

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

out = np.zeros((len(x)**3, 3))
out[:, 0] = np.repeat(x, len(x)**2)
out[:, 1] = np.tile(np.repeat(y, len(x)), 3)
out[:, 2] = np.tile(z, len(x)**2)

выход: * +1010 *

[[1. 4. 7.]
 [1. 4. 8.]
 [1. 4. 9.]
 [1. 5. 7.]
 [1. 5. 8.]
 [1. 5. 9.]
 [1. 6. 7.]
 [1. 6. 8.]
 [1. 6. 9.]
 [2. 4. 7.]
 [2. 4. 8.]
 [2. 4. 9.]
 [2. 5. 7.]
 [2. 5. 8.]
 [2. 5. 9.]
 [2. 6. 7.]
 [2. 6. 8.]
 [2. 6. 9.]
 [3. 4. 7.]
 [3. 4. 8.]
 [3. 4. 9.]
 [3. 5. 7.]
 [3. 5. 8.]
 [3. 5. 9.]
 [3. 6. 7.]
 [3. 6. 8.]
 [3. 6. 9.]]

Если вы априори знаете, что координаты являются целыми числами, вы можете даже:

out = np.zeros((len(x)**3, 3), dtype=int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...