这似乎是一个非常简单的问题,但我无法在任何地方找到一个好的答案。我如何使用numpy以标量的形式乘以(就地)选择列(可能由列表选择)?
E.g。将列0和2乘以4
In: arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
Out: arr=([(4,2,12,5,6,7), (16,5,24,2,5,3), (28,8,36,2,5,9)])
目前我在多个步骤中执行此操作,但我觉得必须有更好的方法,特别是如果列表变大。目前的方式:
arr['f0'] *= 4
arr['f2'] *= 4
答案 0 :(得分:3)
您可以按如下方式使用数组切片 -
In [10]: arr=([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
In [11]: narr = np.array(arr)
In [13]: narr[:,(0,2)] = narr[:,(0,2)]*4
In [14]: narr
Out[14]:
array([[ 4, 2, 12, 5, 6, 7],
[16, 5, 24, 2, 5, 3],
[28, 8, 36, 2, 5, 9]])
答案 1 :(得分:0)
另一种解决方案是创建一个继承自np.ndarray
的类,并为其添加一个方法,使就地变异更加直观。
<强>代码:强>
import numpy as np
class A(np.ndarray):
def __new__(cls, a):
arr = np.asarray(a)
arr = arr.view(cls)
return arr
def mutate(self, col, k):
self[:,col] *= k
return self
a = A([(1,2,3,5,6,7), (4,5,6,2,5,3), (7,8,9,2,5,9)])
print a
print '---------------------'
a.mutate(0, 4)
a.mutate(2, 4)
print a
<强>结果:强>
[[1 2 3 5 6 7]
[4 5 6 2 5 3]
[7 8 9 2 5 9]]
---------------------
[[ 4 2 12 5 6 7]
[16 5 24 2 5 3]
[28 8 36 2 5 9]]
答案 2 :(得分:0)
您可以将以下内容与数组切片一起使用
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if (kind == UICollectionElementKindSectionFooter) {
let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CartFooterCollectionReusableView", for: indexPath)
// Customize footerView here
return footerView
} else if (kind == UICollectionElementKindSectionHeader) {
let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CartHeaderCollectionReusableView", for: indexPath)
// Customize headerView here
return headerView
}
fatalError()
}