块状吸气剂/不同尺寸阵列的设定者

时间:2018-07-23 08:00:58

标签: python arrays numpy

如果我想要的话:

如果x是一维的,则返回x[I]

如果x是二维的,则返回x[i,:]

如果x是三维的,则返回x[i, j, :]

...

x是numpy数组

class Foo:
   def __init__(self, x):
       self.x = x  # an n-d array

   def pop_q(q, tuple):
       q = zeros(tuple)

   def set_q(q, i, j=None, qq):
       if q.ndim == 1:
           q[i] = qq
       else if q.ndim == 2:
           q[i, :] = qq
       else if q.ndim == 3:
           q[i, j, :] = qq

   def get_q(q, i, j=None):
       if q.ndim == 1:
           return q[i]
       else if q.ndim == 2:
           return q[i, :]
       else if q.ndim == 3:
           return q[i, j, :]

但是有更好的书写方式吗? (也许使用*args到任意维数组)

我这样做的原因是为了确保模块化

1 个答案:

答案 0 :(得分:0)

我认为这应该可行:

def get_q(self, i, j=None):
    slicing = (i, j, slice(None))[:self.x.ndim]
    return self.x[slicing]

记住切片(无)对应于:

所以我创建了一个与(i,j,:)相对应的元组,但是我只保留了该元组的第一个self.x.ndim元素

如果您想要一种适用于任何尺寸的解决方案:

def get_q(self, *indices):
    slicing = (indices + (slice(None),) * self.x.ndim)[:self.x.ndim]
    return self.x[slicing]

设置者应该以完全相同的方式工作。