PYTHON - 找出数组中每 10 个整数中的最大值
PYTHON - finding the maximum of every 10 integers in an array
我有一个很大的整数数组,我需要成对打印每10个整数中的最大值及其在数组中的对应索引。
ex. (max_value, index of max_value in array)
我可以成功找到前 10 个整数中的最大值和相应的索引,但是我无法遍历整个数组。
我试过使用:
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for i in split:
j = max(i)
k = i.index(max(i))
print (j,k)
此方法的问题是它将我的数组分成 10 个块,因此 max_values 是正确的,但索引不准确(所有索引都在 0-10 之间。)
我需要找到一种方法来执行此操作,该方法不会将我的数组拆分成块,以便保留原始索引。我确定有一种更简单的循环查找最大值的方法,但我似乎无法弄清楚。
您需要循环遍历列表,但我们可以更改您的 split
循环,使其更有效地满足您的需求。
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for i in range(len(split)):
#Now instead of being the list, i is the index, so we can use 10*i as a counter
j = max(split[i])
#j = max(i)
k = split[i].index(j) + 10*i #replaced max(i) with j since we already calculated it.
#k = i.index(max(i))
print (j,k)
尽管以后请为您的 split
列表起一个新名称,因为 split
已经是 python 中的一个函数。也许 split_list
或 separated
或其他一些看起来不像 split()
函数的名称。
因此,通过使用示例数组进行调试,我们发现 split
returns 像这样的二维列表:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]
并且每次 for
循环运行时,它都会按顺序遍历其中一个列表。首先它通过第一个内部列表,然后是第二个等等。所以每次 for
循环跳转到下一个列表时,我们只需添加 10。由于列表中可以有超过 2 个列表,我们存储数字我们需要添加一个变量并在每个循环中添加 10:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
counter = 0
for i in split:
j = max(i)
k = i.index(max(i))
print (j,k+counter)
counter += 10
你可以test it here
您需要统计在当前 window 之前出现的元素数量。这将完成工作:
a=list(range(5,35))
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for ind,i in enumerate(split):
j = max(i)
k = i.index(j)
print (j,k+ind*10)
这会打印
(14, 9)
(24, 19)
(34, 29)
对您当前代码的小修改:
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for index, i in enumerate(split):
j = max(i)
k = i.index(max(i))
print (j, k+10*index)
toolz package has a partition_all
函数将一个序列分成大小相等的元组,因此您可以执行类似的操作。
import toolz
ns = list(range(25))
[max(sublist) for sublist in toolz.partition_all(10, ns)]
这将 return [9, 19, 24]
。
任意输入的numpy解决方案:
import numpy as np
a = np.random.randint(1,21,40) #40 random numbers from 1 to 20
b = a.reshape([4,10]) #shape into chunks 10 numbers long
i = b.argsort()[:,-1] #take the index of the largest number (last number from argsort)
# from each chunk. (these don't take into account the reshape)
i += np.arange(0,40,10) #add back in index offsets due to reshape
out = zip(i, a[i]) #zip together indices and values
您可以通过仅枚举一次并使用 zip
将您的列表分成几组来简化此操作:
n=10
for grp in zip(*[iter(enumerate(some_list))]*n):
grp_max_ind, grp_mv=max(grp, key=lambda t: t[1])
k=[t[1] for t in grp].index(grp_mv)
print grp_mv, (grp_max_ind, k)
如果需要生成器,请在 Python 2 中使用 izip
(或使用 Python 3)
from itertools import izip
for grp in izip(*[iter(enumerate(some_list))]*n):
grp_max_ind, grp_mv=max(grp, key=lambda t: t[1])
k=[t[1] for t in grp].index(grp_mv)
print grp_mv, (grp_max_ind, k)
如果长度不是 n
,Zip 将截断最后一组
使用 numpy
的示例。首先让我们生成一些数据,即范围从 1 到 V
且长度(值的数量)L
:
的整数
import numpy as np
V = 1000
L = 45 # method works with arrays not multiples of 10
a = np.random.randint(1, V, size=L)
现在解决大小为N
的子数组的问题:
import numpy as np
N = 10 # example "split" size
sa = np.array_split(a, range(N, len(a), N))
sind = [np.argpartition(i, -1)[-1] for i in sa]
ind = [np.ravel_multi_index(i, (len(sa), N)) for i in enumerate(sind)]
vals = np.asarray(a)[np.asarray(ind)]
split_imax = zip(vals, ind) # <-- output
我有一个很大的整数数组,我需要成对打印每10个整数中的最大值及其在数组中的对应索引。
ex. (max_value, index of max_value in array)
我可以成功找到前 10 个整数中的最大值和相应的索引,但是我无法遍历整个数组。
我试过使用:
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for i in split:
j = max(i)
k = i.index(max(i))
print (j,k)
此方法的问题是它将我的数组分成 10 个块,因此 max_values 是正确的,但索引不准确(所有索引都在 0-10 之间。) 我需要找到一种方法来执行此操作,该方法不会将我的数组拆分成块,以便保留原始索引。我确定有一种更简单的循环查找最大值的方法,但我似乎无法弄清楚。
您需要循环遍历列表,但我们可以更改您的 split
循环,使其更有效地满足您的需求。
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for i in range(len(split)):
#Now instead of being the list, i is the index, so we can use 10*i as a counter
j = max(split[i])
#j = max(i)
k = split[i].index(j) + 10*i #replaced max(i) with j since we already calculated it.
#k = i.index(max(i))
print (j,k)
尽管以后请为您的 split
列表起一个新名称,因为 split
已经是 python 中的一个函数。也许 split_list
或 separated
或其他一些看起来不像 split()
函数的名称。
因此,通过使用示例数组进行调试,我们发现 split
returns 像这样的二维列表:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]
并且每次 for
循环运行时,它都会按顺序遍历其中一个列表。首先它通过第一个内部列表,然后是第二个等等。所以每次 for
循环跳转到下一个列表时,我们只需添加 10。由于列表中可以有超过 2 个列表,我们存储数字我们需要添加一个变量并在每个循环中添加 10:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
counter = 0
for i in split:
j = max(i)
k = i.index(max(i))
print (j,k+counter)
counter += 10
你可以test it here
您需要统计在当前 window 之前出现的元素数量。这将完成工作:
a=list(range(5,35))
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for ind,i in enumerate(split):
j = max(i)
k = i.index(j)
print (j,k+ind*10)
这会打印
(14, 9)
(24, 19)
(34, 29)
对您当前代码的小修改:
a = some array of integers
split = [a[i:i+10] for i in xrange(0, len(a), 10)]
for index, i in enumerate(split):
j = max(i)
k = i.index(max(i))
print (j, k+10*index)
toolz package has a partition_all
函数将一个序列分成大小相等的元组,因此您可以执行类似的操作。
import toolz
ns = list(range(25))
[max(sublist) for sublist in toolz.partition_all(10, ns)]
这将 return [9, 19, 24]
。
任意输入的numpy解决方案:
import numpy as np
a = np.random.randint(1,21,40) #40 random numbers from 1 to 20
b = a.reshape([4,10]) #shape into chunks 10 numbers long
i = b.argsort()[:,-1] #take the index of the largest number (last number from argsort)
# from each chunk. (these don't take into account the reshape)
i += np.arange(0,40,10) #add back in index offsets due to reshape
out = zip(i, a[i]) #zip together indices and values
您可以通过仅枚举一次并使用 zip
将您的列表分成几组来简化此操作:
n=10
for grp in zip(*[iter(enumerate(some_list))]*n):
grp_max_ind, grp_mv=max(grp, key=lambda t: t[1])
k=[t[1] for t in grp].index(grp_mv)
print grp_mv, (grp_max_ind, k)
如果需要生成器,请在 Python 2 中使用 izip
(或使用 Python 3)
from itertools import izip
for grp in izip(*[iter(enumerate(some_list))]*n):
grp_max_ind, grp_mv=max(grp, key=lambda t: t[1])
k=[t[1] for t in grp].index(grp_mv)
print grp_mv, (grp_max_ind, k)
如果长度不是 n
使用 numpy
的示例。首先让我们生成一些数据,即范围从 1 到 V
且长度(值的数量)L
:
import numpy as np
V = 1000
L = 45 # method works with arrays not multiples of 10
a = np.random.randint(1, V, size=L)
现在解决大小为N
的子数组的问题:
import numpy as np
N = 10 # example "split" size
sa = np.array_split(a, range(N, len(a), N))
sind = [np.argpartition(i, -1)[-1] for i in sa]
ind = [np.ravel_multi_index(i, (len(sa), N)) for i in enumerate(sind)]
vals = np.asarray(a)[np.asarray(ind)]
split_imax = zip(vals, ind) # <-- output