如何定义(x,y)坐标的二维数组

时间:2019-05-22 14:57:55

标签: python numpy multidimensional-array 2d cartesian-coordinates

我有一个要在python中建模的(x,y)坐标的2d空间,并且想知道一种在python中定义2d空间的方法,可以在其中为点(x,y)分配多个值。坐标上的后续值将根据某些坐标相关的计算而更改。

我考虑过使用numpy数组根据用户输入的大小创建2d数组。我首先创建一个2d n * m零的numpy数组,以后的代码计算部分都是在点上完成的。但是以这种方式,每个点(x,y)只有一个值。

import numpy as np

x_coor=135

y_coor=120

grid=np.zeros((x_coor,y_coor)

有没有一种方法可以使它成为grid [x,y] =(value1,value2),还有一种更好的方法来定义除numpy数组之外的网格?

2 个答案:

答案 0 :(得分:1)

您确实可以为此使用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')])

请注意,尽管元组是不可变的,所以如果您打算使用这些坐标执行运算,则应该采用第一种方法。

答案 1 :(得分:0)

对问题的简短回答:您应该使用pandas而不是numpy数组。 Numpy旨在加快数组计算的速度,因此不允许将数组的每个元素都定义为列表。但是,熊猫数据框确实允许这些类型的操作。这是在熊猫中进行此操作的方式,尤其要注意如何灵活定义原始数据框,以便以后可以对其进行操作以更改每个单元格中包含的列表的长度:

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]