0

我有这个问题:

在我的软件中,我要么处理单个数组,要么处理 3 个数组的列表(它们是像素化天空图的 1 个或 3 个组件)。

如果单个数组是 1 个数组的列表,那么无论元素数量如何,都可以很容易地透明地迭代它。

现在,假设我想对这些地图进行平方:

my_map = np.ones(100) # case of single component
# my_map = [np.ones(100) for c in [0, 1, 2]] # case of 3 components

if isinstance(my_map, list): #this is ugly
    my_map_2 = [m**2 for m in my_map]
else:
    my_map = my_map ** 2

您对如何改善这一点有什么建议吗?

4

3 回答 3

0

如果返回值是单个值,您可以将其转换为列表。使用 list() 工厂方法。

my_map = []
temp = np.ones(100) # case of single component
# Append your temp value.. either single or a list to your empty list..
my_map.append(temp)
my_map_2 = [m**2 for m in my_map]

我假设您的方法np.ones(100)可能会返回一个值,甚至是一个列表..

于 2012-10-01T19:51:55.263 回答
0

你为什么不直接创建一个二维数组?

my_array = np.ones((100,3), dtype=float)

这样,您可以一次直接对“三个”数组进行平方。您仍然可以访问单个元素:

(x, y, z) = my_array.T

where.T是该方法的快捷.transpose方式。

使用这种方法比在列表上循环要高效得多,尤其是当您将相同的函数应用于三个数组时。即使您想对第一个数组进行平方,将第二个数组加倍并取第三个数组的平方根,您也可以:

my_array[:,0] **=2
my_array[:,1] *=2
my_array[:,2] **=0.5
于 2012-10-01T20:06:53.760 回答
0

你试过numpy.asarray吗?那么 if-else 就是

my_map = numpy.asarray(my_map)**2

还要检查numpy.asanyarray您是否还想处理 ndarrays 的子类。

我经常numpy.asarray在我的函数的开头调用,所以它们可以在列表和数组上工作。

于 2012-10-02T18:20:44.107 回答