numpy 如何定义(x,y)坐标的2D数组

z4iuyo4d  于 2022-12-23  发布在  其他
关注(0)|答案(3)|浏览(202)

我有一个二维空间的(x,y)坐标,我想在python中建模,并想知道一种方法来定义二维空间,在那里我可以给一个点(x,y)赋多个值,稍后坐标值将根据一些坐标相关的计算而改变。
我考虑过使用numpy array根据用户输入的大小创建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数组更好的方法来定义grid?

z2acfund

z2acfund1#

你确实可以使用numpy来完成这个任务,一种方法是将3d数组定义为np.zeros((x_coor, y_coor, 2)),并保存最后一个轴沿着的每个坐标。
另一种使用numpy获得所需结构的方法是定义tuplesndarray,并以上述方式更新每个点,即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')])

但是要注意元组是 * 不可变的 *,所以如果您打算对这些坐标执行操作,应该使用第一种方法。

zbsbpyhn

zbsbpyhn2#

对您问题的简短回答:你应该使用panda而不是numpy数组。Numpy是用来加速数组计算的,所以它不允许将数组的每个元素定义为列表。Pandas Dataframe 允许这些类型的操作。下面是你如何在pandas中执行这样的操作。并且特别注意原始 Dataframe 是如何被灵活地定义的,以便它可以在以后被操纵以改变包含在每个单元中的列表的长度:

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]
xpszyzbs

xpszyzbs3#

我不确定你的应用程序,但另一个数学启发的解决方案是将2d坐标存储为numpy的复数,存储一个FP double,用于真实的坐标和虚坐标,可以通过np.realnp.imag访问,这也使得减去复数和计算欧几里得距离的绝对值变得容易。

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

相关问题