如何定义 (x,y) 坐标的二维数组
How to define a 2D array of (x,y) coordinates
我有一个 2d space 的 (x,y) 坐标,我想在 python 中建模并且想知道一种在 [=] 中定义 2d space 的方法17=] 在这里我可以为一个点 (x,y) 分配多个值。坐标的后期值将根据一些依赖于坐标的计算而改变。
我考虑过使用 numpy 数组根据用户输入的大小创建二维数组。我首先创建了一个 2d n*m numpy 零数组,后面的部分代码计算是在点上完成的。但是这样一来每个点(x,y)就只有一个值。
import numpy as np
x_coor=135
y_coor=120
grid=np.zeros((x_coor,y_coor)
有没有办法让它变成网格[x,y]=(value1,value2),有没有比 numpy 数组更好的定义网格的方法?
您确实可以为此使用 numpy。一种方法是将 3d
数组定义为 np.zeros((x_coor, y_coor, 2))
并保存沿最后一个轴的每个坐标。
使用 numpy 获得所需结构的另一种方法是定义 tuples
的 ndarray
,并以上述方式更新每个点,即 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')])
请注意,虽然元组 不可变 ,因此如果您打算使用这些坐标执行操作,您应该使用第一种方法。
您问题的简短回答:您应该使用 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]
我有一个 2d space 的 (x,y) 坐标,我想在 python 中建模并且想知道一种在 [=] 中定义 2d space 的方法17=] 在这里我可以为一个点 (x,y) 分配多个值。坐标的后期值将根据一些依赖于坐标的计算而改变。
我考虑过使用 numpy 数组根据用户输入的大小创建二维数组。我首先创建了一个 2d n*m numpy 零数组,后面的部分代码计算是在点上完成的。但是这样一来每个点(x,y)就只有一个值。
import numpy as np
x_coor=135
y_coor=120
grid=np.zeros((x_coor,y_coor)
有没有办法让它变成网格[x,y]=(value1,value2),有没有比 numpy 数组更好的定义网格的方法?
您确实可以为此使用 numpy。一种方法是将 3d
数组定义为 np.zeros((x_coor, y_coor, 2))
并保存沿最后一个轴的每个坐标。
使用 numpy 获得所需结构的另一种方法是定义 tuples
的 ndarray
,并以上述方式更新每个点,即 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')])
请注意,虽然元组 不可变 ,因此如果您打算使用这些坐标执行操作,您应该使用第一种方法。
您问题的简短回答:您应该使用 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]