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

问题描述 投票:0回答:3

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

我考虑使用 numpy array 根据用户输入的大小创建二维数组。我首先创建一个 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 数组之外还有更好的方法来定义网格吗?

python numpy multidimensional-array 2d cartesian-coordinates
3个回答
4
投票

你确实可以使用 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
投票

我不确定你的应用程序,但另一个受数学启发的解决方案是将 2D 坐标存储为 numpy 的复数。它们存储实部和虚部坐标的浮点双精度值,可以使用

np.real
np.imag
访问。这也使得复数相减和将欧几里得距离计算为绝对值变得容易。

a = np.zeros((3, 3), dtype=np.cdouble)
a[2,2] = 1 + 1j

0
投票

问题的简短回答:您应该使用 pandas 而不是 numpy 数组。 Numpy 旨在加速数组计算,因此它不允许将数组的每个元素定义为列表。然而,Pandas 数据框确实允许此类操作。以下是如何在 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]
© www.soinside.com 2019 - 2024. All rights reserved.