gpt4 book ai didi

python - 根据键 reshape 数组

转载 作者:行者123 更新时间:2023-11-28 18:44:18 27 4
gpt4 key购买 nike

我不知道我想做什么的确切技术术语,所以我会尝试用一个例子来演示:

我有两个长度相同的向量,ab,如下所示:

In [41]:a
Out[41]:
array([ 0.61689215, 0.31368813, 0.47680184, ..., 0.84857976,
0.97026244, 0.89725481])

In [42]:b
Out[42]:
array([35, 36, 37, ..., 36, 37, 38])

a 包含 N 个 float ,b 包含 N 个元素:具有 10 个不同值的键:35、36、37、...、43、44

我希望得到一个新矩阵 M,它有 10 列,其中第一列包含 a 中的所有行,其对应的键在 b 是 35。M 中的第二列包含 a 中其对应的 b 中的键为 36 的所有行。等等。所有直到列10 个 M

我希望这是清楚的。谢谢

最佳答案

itertools.groupby 可用于对值进行分组(排序后)。 numpy arrays 的使用是可选的。

import numpy as np
import itertools
N=50
# a = np.random.rand(50)*100
a = np.random.randint(0,100,N) # int to make printing more compact
b = np.random.randint(35,45, N)

# make structured array to easily sort both arrays together
dtype = np.dtype([('a',float),('b',int)])
ab = np.ndarray(a.shape,dtype=dtype)
ab['a'] = a
ab['b'] = b
# ab = np.sort(ab,order=['b']) # sorts both 'b' and 'a'
I = np.argsort(b,kind='mergesort') # preserves order
ab = ab[I]

# now group, and extract lists of lists
gp = itertools.groupby(ab, lambda x: x['b'])
xx = [list(x[1]) for x in gp]
#print np.array([[y[0] for y in x] for x in xx]) # list of lists

def filled(x):
M = max(len(z) for z in x)
return np.array([z+[np.NaN]*(M-len(z)) for z in x])
print filled([[y[1] for y in x] for x in xx]).T
print filled([[y[0] for y in x] for x in xx]).T

制作:

[[ 35.  36.  37.  38.  39.  40.  41.  42.  43.  44.]
[ 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.]
[ nan 36. 37. nan 39. 40. 41. 42. 43. 44.]
[ nan 36. 37. nan 39. 40. 41. 42. 43. 44.]
...]

[[ 54. 69. 34. 28. 71. 53. 33. 19. 64. 56.]
[ 90. 52. 11. 9. 50. 53. 25. 37. 69. 56.]
[ nan 97. 31. nan 69. 35. 2. 80. 91. 54.]
[ nan 33. 87. nan 47. 90. 81. 45. 86. 57.]
...]

我正在使用 argsortmergesort 来保留子列表中 a 的顺序。 np.sort 按词法对 ba 进行排序(与我对 order 参数的预期相反)。

另一种方法是使用 Python 字典,它也保留 a 的顺序。它在大型阵列上可能更慢,但隐藏的细节更少:

import collections
d = collections.defaultdict(list)
for k,v in zip(b,a):
d[k].append(v)
values = [d[k] for k in sorted(d.keys())]
print filled(values).T

关于python - 根据键 reshape 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22261126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com