frompyfunc如何遍历数组?

时间:2018-10-30 00:25:54

标签: python numpy

我正在处理代表迷宫路由网格的大型数组,每个元素都是具有x,y属性的Cell对象。

我正在尝试使用numpyfunc通过矢量化函数初始化每个单元格中的坐标。

我有一个向量化函数,用于设置Cell对象的X坐标:

def setCellX(self,c,x):
         c.setX(x)
         return c

setCellX_v = np.vectorize(self.setCellX)

我将其包装在frompyfunc

setCellX_npfunc = np.frompyfunc(self.setCellX_v,2,1)

当我在一维数组上调用它时,它按预期工作

Gx = 3000
Gy = 4000

# Initialize single row
R = np.array([Cell(0,y) for y in range(int(self.Gy))])

# Create array of X-coordinates
x_indices = [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

print R[6].x
0

setCellX_npfunc(R,x_indices)
print R[6].x
6

当我将R设置为二维数组时,我希望numpyfunc遍历每行并相应地设置X值:

R = np.empty(shape=(20,20),dtype=object)
R.fill(Cell(0,0))

setCellX_npfunc(R,x_indices)
print(R[3][6].x)
19

为什么numpyfunc不会像在第一个示例中那样将每个1-d向量的X值设置为x_indices中的相应值?

1 个答案:

答案 0 :(得分:0)

根据您的评论并假设Cell个对象具有x, y个属性和一些其他默认属性将不起作用:

class Cell:
    def __init__(self, x,y):
        self.x = x
        self.y = y
    ...

假设您想要一个100 * 100的数组,请像这样初始化您的数组:

CellList = [[Cell(x,y) for y in range(100)] for x in range(100)]
# Optional translate it into np.array for easier indexing
CellArr = np.array(CellList)

这将返回具有正确Cell元素的100 * 100 Cell数组。要验证:

CellArr[1,2].x
>>> 1

请注意,numpy实际上不能大大加快数组的速度,因为Cell在向量化时实际上无法通过C代码。它只能用于更好的索引编制。

向量化实际上并不能提高您的速度:

%%timeit
CellList = [[Cell(x,y) for y in range(100)] for x in range(100)]
# Optional translate it into np.array for easier indexing
CellArr = np.array(CellList)

>>> 24.2 ms ± 542 µs per loop

向量化功能:

def vecX(c, x):
    c = Cell(x, 0)
    return c

def vecY(c, y):
    c.y = y
    return c

vec = np.vectorize(vecX)
vey = np.vectorize(vecY)

结果:

%%timeit
l = []
n = np.zeros((100,100))
for i in range(len(n)):
    l.append(vec(n[i, :], i))
CellArr = np.vstack(l)
for j in range(len(CellArr)):
    vey(CellArr[:, j], j)

>>> 23.5 ms ± 5 ms per loop