如果你放弃了名称了一下,这是不是太狠:
import numpy
a = numpy.arange(12).reshape(3,4)
b = numpy.arange(20).reshape(4,5).T + 10
b_rows = [0, 1, 0, 2, 1]
columns_ids = numpy.array([False, True, False, True])
b[:, columns_ids] = a[:, columns_ids][b_rows]
b
#>>> array([[10, 1, 20, 3],
#>>> [11, 5, 21, 7],
#>>> [12, 1, 22, 3],
#>>> [13, 9, 23, 11],
#>>> [14, 5, 24, 7]])
如果你真的想要的名称的外部数组:
a = numpy.arange(12).reshape(3,4)
b = numpy.arange(20).reshape(4,5).T + 10
a_rownames = numpy.array(["m1", "m2", "m3"])
b_rownames = numpy.array(["m1", "m2", "m1", "m3", "m2"])
_, b_rows = numpy.where(a_rownames == b_rownames[:, numpy.newaxis])
b[:, columns_ids] = a[:, columns_ids][b_rows]
b
#>>> array([[10, 1, 20, 3],
#>>> [11, 5, 21, 7],
#>>> [12, 1, 22, 3],
#>>> [13, 9, 23, 11],
#>>> [14, 5, 24, 7]])
这片神奇有三个步骤:
_, b_rows = numpy.where(a_rownames == b_rownames[:, numpy.newaxis])
首先,我们产生两个垂直阵列:
a_rownames
#>>> array(['m1', 'm2', 'm3'],
#>>> dtype='<U2')
b_rownames[:, numpy.newaxis]
#>>> array([['m1'],
#>>> ['m2'],
#>>> ['m1'],
#>>> ['m3'],
#>>> ['m2']],
#>>> dtype='<U2')
然后我们==
比较会用“广播”重复这些阵列,直到尺寸匹配:
a_rownames == b_rownames[:, numpy.newaxis]
#>>> array([[ True, False, False],
#>>> [False, True, False],
#>>> [ True, False, False],
#>>> [False, False, True],
#>>> [False, True, False]], dtype=bool)
numpy.where
给xs
和ys
索引此数组来获取所有值为True
。我们只对ys
感兴趣,所以我们忽略了xs
。
_, b_rows = numpy.where(a_rownames == b_rownames[:, numpy.newaxis])
另一片神奇:
b[:, columns_ids] = a[:, columns_ids][b_rows]
需要知道两种不同类型的索引:
索引像
array[xs]
或
array[xs, :]
得到行(他们是由于广播相同)会给你所有由于上述规则而匹配的索引,在第一个轴上进行过滤。
使用
array[:, ys]
将在第二轴线进行过滤。
所以我们首先筛选列(第二轴)
b[:, columns_ids]
#>>> array([[ 1, 3],
#>>> [ 5, 7],
#>>> [ 1, 3],
#>>> [ 9, 11],
#>>> [ 5, 7]])
a[:, columns_ids]
#>>> array([[ 1, 3],
#>>> [ 5, 7],
#>>> [ 9, 11]])
然后我们就a
(第一轴)过滤行:
a[:, columns_ids][b_rows]
#>>> array([[ 1, 3],
#>>> [ 5, 7],
#>>> [ 1, 3],
#>>> [ 9, 11],
#>>> [ 5, 7]])
他们现在是相同的形状,这样你就可以做切片分配:
b[:, columns_ids] = a[:, columns_ids][b_rows]
请注意,实际上您并不需要命名列来执行此操作,但numpy确实支持命名列(请参阅dtype的文档),熊猫的数据框专门用于反映您在R中习惯使用的用法。 – mdurant 2014-09-28 15:57:47
'熊猫'的描述,它看起来像我需要从R轻松迁移到Python世界。谢谢你指出我!但如果这可能与numpy有关,这也将很好。 – DrDom 2014-09-28 16:27:54