【问题标题】:Numpy calculate Min Max in random 2D or 1D arrayNumpy 在随机 2D 或 1D 数组中计算 Min Max
【发布时间】:2020-08-05 07:20:40
【问题描述】:

我正在尝试获取每行中最小值或最大值的总和。如果第一个索引上的数字大于 12,则返回该行中的最大数字,否则返回该行中的最小数字。请注意,在下面给出的示例中,它是一个 4 x 3 2D 数组。但是,我希望我的代码在给定任何数组大小或形状的情况下都能正常工作。

import numpy as np

arr = np.array([[11, 12, 13],
                [14, 15, 16],
                [17, 15, 11],
                [12, 14, 15]])

i_max = np.amax(arr,axis=1)
i_min = np.amin(arr,axis=1)
print(i_max)
print(i_min)

到目前为止,我只能使用amaxamin 获得每行中的最小值或最大值。我缺少的是访问每行中的第一个值并使用 if else 语句将大小与 12 进行比较。任何人都可以给出提示。

给定样本的正确输出应该是11 + 16 + 17 + 12 = 56

【问题讨论】:

  • “任何数组形状”是指大于 2 维的数组吗?

标签: python-3.x numpy


【解决方案1】:

np.where 包含 3 个输入
第一个是你的条件 [ False, True, True False ...]
secondthird 输入是可能的值

因此,如果条件为 True,则 grep 第二个输入的值
否则,取第三个输入的值。

np.where(arr[:,0] > 12, np.max(arr, axis=1), np.min(arr, axis=1))

返回:array([11, 16, 17, 12])

如果您需要总和,只需添加总和 :):

np.where(arr[:,0] > 12, np.max(arr, axis=1), np.min(arr, axis=1)).sum()

返回:56

表示它的另一种方式是: [xv if c else yv for c, xv, yv in zip(condition, x, y)]

或者只是阅读文档:https://numpy.org/doc/stable/reference/generated/numpy.where.html :)

【讨论】:

  • 在表达式后添加.sum()
【解决方案2】:

你快到了。您可以创建一个mask(无论您想要什么,这里是每行大于 12 的第一个元素)并计算您的操作如下。通过更改min/max 中的轴和您想要的mask 条件,这很容易扩展到多维数组:

mask=arr[:,0]>12
(arr.max(1)*mask + arr.min(1)*~mask).sum()

输出:

56

比较

def m1(arr):
  mask=arr[:,0]>12
  return (arr.max(1)*mask+arr.min(1)*~mask).sum()

#@Dieter's solution
def m2(arr):
  return np.where(arr[:,0] > 12, np.max(arr, axis=1), np.min(arr, axis=1)).sum()
 
in_ = [np.random.randint(100, size=(n,n)) for n in [10,100,1000,10000]]

运行时m1似乎快了一点,但是,它们在更大的数组中收敛到相同的性能。

【讨论】:

  • 看起来您在笔记本上使用benchit?您可能想尝试新版本0.0.4,它现在对同样的支持有了更好的支持。这是一个示例运行 - github.com/droyed/benchit/blob/master/docs/source/…。 TL;博士:在绘图前使用benchit.set_environ('notebook')
  • @Divakar 我正在使用您的benchit,感谢您的贡献:)。但是,我不使用笔记本,只使用终端。新版本是否仅针对笔记本电脑的升级?
  • 嗯,这是所有后端的普遍改进。规格没有出现在这个情节中,所以我认为它是一个笔记本运行。在您的情况下,它可能是一个非交互式后端,假设您不是故意隐藏规范。如果可以的话,请尝试新版本,如果它出现,请告诉我,假设您确实希望它们出现。注意:对于非交互式后端,您仍然必须使用 benchit.set_environ('notebook')
  • @Divakar 届时将升级。再次感谢你。我故意从图表中删除规格,因为它对帖子没有用处。
  • 规格是基准测试的重要组成部分,当其他人可能想在他们的最后测试相同的基准设置时。像很多时候一样,拥有更大内存的人可以在数据集大小上走得更远。因此,那些 NumPy 优化只出现在那个远端。不管规格问题如何,新版本的总体改进应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 2021-02-08
  • 1970-01-01
  • 2021-08-05
  • 2021-01-28
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多