问题:
我有一个数组列表,例如:
a = [array([0, 4]), array([1, 3, 2])]
从另一个变量X,我想取两个子集,这些子集由a中每个数组中的索引选择。
X = [0.1, 0.7, 0.9, 0.2, 0.3]
我现在想要的是:
result_1 = [0.1, 0.3]
result_2 = [0.7, 0.2, 0.9]
我的解决方案是使用for循环,例如:
def getresult(X, indices):
result = []
for i in indices:
result.append(X[i])
return result
这很好用:
getresult(X, a[0])
[0.1, 0.3]
我以前的编程经验表明,有一种更加美观和简单的方法可以做到这一点。 最好有人知道不需要循环的解决方案。
背景/应用
背景:参数优化的交叉验证。
我有一个list
包含数据点,例如
X = [0.1, 0.7, 0.9, 0.2, 0.3]
现在我想重复从该列表中取出z个样本(实际上比这个例子大得多)。因此我创建了一个新变量:
indices = np.arange(0,len(X),1)
HERE: [0, 1, 2, 3, 4]
然后我随机播放并创建nfold样本:
np.random.shuffle(indices)
nfold_indices = np.array_split(indices,nfolds)
HERE with nfolds = 2: nfold_indices = [array([0, 4]), array([1, 3, 2])]
答案 0 :(得分:1)
return [X[i] for i in indices]
可行。
答案 1 :(得分:0)
我的第一次尝试,基本上遵循你以更紧凑的方式做事的方式是:
result1, result2 = [ [X[ii] for ii in array] for array in a]
如果你不愿意将X转换为numpy数组,你可以这样做:
X = np.array([ 0.1, 0.7, 0.9, 0.2, 0.3])
result1, result2 = X[a[0]], X[a[1]]
但是这有一个问题,它不能很好地概括为一个以上的几个数组。即使有些人会讨厌我使用lambda,另一种做得更好的紧凑方式是:
results = map(lambda x: X[x], a)
答案 2 :(得分:0)
如果Severity Code Description Project File Line Suppression State
Error CS0012 The type 'Member' is defined in an assembly that is not referenced. You must add a reference to assembly 'App.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. App.CoreServices C:\My Work\Credit Union Application\CreditSolutionApp\App.CoreServices\CoreServices\MembershipCore\MembershipCore.cs 23 Active
的索引不在a
中,请使用列表推导,默认为安全性:
X
因此,如果您有一个包含超出范围索引的任意数组:
a = [array('i', [0, 4]), array('i', [1, 3, 2])]
X = [0.1, 0.7, 0.9, 0.2, 0.3]
result = [[(X[i:]+[0])[0] for i in o] for o in a]
# ^ default
# [[0.1, 0.3], [0.7, 0.2, 0.9]]
您的代码不会中断