如何从2个数组中选择项目?

时间:2019-11-13 05:36:33

标签: python arrays numpy

我有2个包含一些数据的数组ab。我还有一个数组select,我想使用它从a或b中选择。我只是想知道是否有Python方式来做到这一点。这是我当前的实现,将a和b的每一行放入列表中,然后从中选择。

a = np.zeros(shape=(10,2,1,3,4))
b = np.ones(shape=(10,2,1,3,4))

select = [1,1,1,0,1,0,1,0,1,0]

c = []
for a1,b1,select1 in zip(a,b,select):
    a1b1 = [a1,b1]
    c.append(a1b1[select])

3 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Routines</h2> <table border="2"> <tr bgcolor="#7f7f7f"> <td style="text-align:left">Title</td> <td style="text-align:left">Symbol</td> <td style="text-align:left">Operation</td> <td style="text-align:left">Input Layer 1</td> </tr> <xsl:for-each select="family/Image1in"> <xsl:sort select="routine"/> <tr> <td><xsl:value-of select="normalize-space(routine)"/></td> <td><xsl:value-of select="normalize-space(symbolic)"/></td> <td><xsl:value-of select="normalize-space(operation)"/></td> <td><xsl:value-of select="normalize-space(inputLayer1)"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 是一种非常有效的解决方案,但最多只能用于两个数组。

我会这样:

np.where

这应该可以扩展到任意数量的数组,例如:

np.stack((a, b))[select, np.arange(len(a))]

答案 1 :(得分:0)

如果仅从两个数组中选择,则可以使用select作为权重:

w = np.array(select)
c = (a.T * w + b.T * (1 - w)).T

如果您要组合两个以上的数组,则无法使用此技巧。

答案 2 :(得分:0)

In [512]: a = np.zeros(shape=(10,2,1,3,4)) 
     ...: b = np.ones(shape=(10,2,1,3,4)) 
     ...:  
     ...: select = [1,1,1,0,1,0,1,0,1,0] 

使用转置的方式与@DYZ相同:

In [513]: res = np.where(select, a.T, b.T).T                                    
In [514]: res.shape                                                             
Out[514]: (10, 2, 1, 3, 4)

如果不想转置,可以向select添加尺寸,以便其广播为与ab相同的形状:

In [516]: res1 = np.where(np.array(select)[:,None,None,None,None],a,b)          
In [517]: res1.shape                                                            
Out[517]: (10, 2, 1, 3, 4)
In [518]: np.allclose(res,res1)                                                 
Out[518]: True