如何以数组列表或单个数组的方式处理pythonic方式

时间:2012-10-01 19:47:34

标签: python numpy

我有这个问题:

在我的软件中,我要么处理单个数组,要么处理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

你对如何改进这个有什么建议吗?

3 个答案:

答案 0 :(得分:0)

如果是单个值,您可以将返回值转换为list。使用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)可能返回单个值甚至列表..

答案 1 :(得分:0)

为什么不直接创建2D数组?

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

这样,您可以直接将“三个”数组直接对齐。您仍然可以访问单个元素:

(x, y, z) = my_array.T

其中.T.transpose方法的快捷方式。

使用这种方法比在列表上循环更有效,特别是如果将相同的函数应用于三个数组。比方说,即使你想要对第一个数组进行平方,将第二个数组加倍,然后取第三个数的平方根,你可以:

my_array[:,0] **=2
my_array[:,1] *=2
my_array[:,2] **=0.5

答案 2 :(得分:0)

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

my_map = numpy.asarray(my_map)**2

如果你想处理ndarrays的子类,还要检查numpy.asanyarray

我经常在函数的开头加上numpy.asarray调用,因此它们同时适用于列表和数组。

相关问题