Как определить 2D массив координат (x, y) - PullRequest
2 голосов
/ 22 мая 2019

У меня есть двумерное пространство (x, y) координат, которое я хочу смоделировать в python, и хочу узнать, как определить двумерное пространство в python, где я могу назначить несколько значений точке (x, y). Более поздние значения в координатах будут изменены на основе некоторых координатно-зависимых расчетов.

Я думал об использовании массива numpy для создания массива 2d на основе размера, введенного пользователем. Я начал с создания двумерного массива нулей n * m, и более поздние части вычислений кода делаются на точках. Но таким образом, каждая точка (x, y) имеет только одно значение.

import numpy as np

x_coor=135

y_coor=120

grid=np.zeros((x_coor,y_coor)

Есть ли способ сделать его сеткой [x, y] = (value1, value2), и есть ли лучший способ определить сетку, отличную от массива numpy?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы действительно можете использовать numpy для этого. Одним из способов было бы определить массив 3d как np.zeros((x_coor, y_coor, 2)) и сохранить каждую из координат вдоль последней оси.

Другим способом получения желаемой структуры с использованием numpy может быть определение ndarray из tuples и обновление каждой точки упомянутым способом, то есть grid[x,y] = (value1,value2). Вот как это можно сделать:

x_coor=135
y_coor=120

grid = np.zeros((5,3), dtype='i,i')
grid[0,0] = (1,2)
grid[2,2] = (5,1)
grid[1,0] = (3,5)

print(grid)
array([[(1, 2), (0, 0), (0, 0)],
       [(3, 5), (0, 0), (0, 0)],
       [(0, 0), (0, 0), (5, 1)],
       [(0, 0), (0, 0), (0, 0)],
       [(0, 0), (0, 0), (0, 0)]], dtype=[('f0', '<i4'), ('f1', '<i4')])

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

grid = np.zeros((5,3), dtype='i,i')

coordinates = np.array([(1,2),(2,2), (0,0)], dtype='i,i')
new_vals = np.array([(12,2),(4,1), (0,9)], dtype='i,i')

grid[tuple(zip(*coordinates))] = new_vals

print(grid)
array([[( 0, 9), ( 0, 0), ( 0, 0)],
       [( 0, 0), ( 0, 0), (12, 2)],
       [( 0, 0), ( 0, 0), ( 4, 1)],
       [( 0, 0), ( 0, 0), ( 0, 0)],
       [( 0, 0), ( 0, 0), ( 0, 0)]], dtype=[('f0', '<i4'), ('f1', '<i4')])

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

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

Краткий ответ на ваш вопрос: вы должны использовать панд вместо массива.Numpy предназначен для ускорения вычислений массива, и поэтому он не позволяет определять каждый элемент массива в виде списка.Однако кадры данных Pandas разрешают этот тип операций.Вот как вы могли бы выполнить такую ​​операцию в пандах, и особенно обратите внимание на то, как исходный фрейм данных определяется гибко, чтобы впоследствии им можно было манипулировать, чтобы изменить длину списков, содержащихся в каждой ячейке:

import numpy as np
import pandas as pd
df = pd.DataFrame(columns=[0,1,2])

for i in range(5):
df.loc[i,0] = np.arange(i)
df.loc[i,1] = np.arange(i)
df.loc[i,2] = np.arange(i)

print(df.loc[2,2])

Это запись в ячейке (2,2):

array([0, 1])

, которую вы можете изменить по мере необходимости:

df.loc[2,2] = [10,20,30]

Теперь:

print(df.loc[2,2])

дает вам:

[10, 20, 30]
...