我有这个问题:
在我的软件中,我要么处理单个数组,要么处理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
你对如何改进这个有什么建议吗?
答案 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
调用,因此它们同时适用于列表和数组。