首页 > 编程问答 >使用带有广播或各种数组形状的 numpy select

使用带有广播或各种数组形状的 numpy select

时间:2024-07-29 06:14:36浏览次数:11  
标签:python numpy

我有各种数组形状,我尝试使用 np.select()。我的代码 selected_results 适用于这种情况:

# Given arrays
results = [[array(['alpha'], dtype=object) array([0.16134485])
  array([-2.19302435,  0.57976273]) array([1.25348942, 0.77778261])
  array([0.56136549, 0.56136549]) array([1.12076068, 0.53834429])]
 [array(['alpha'], dtype=object) array([0.11778484])
  array([-0.86983912,  0.24081955]) array([0.84209155, 0.84209155])
  array([0.66394431, 0.66394431]) array([0.51797309, 0.51797309])]
 [array(['alpha'], dtype=object) array([0.11920295])
  array([-2.5218011 ,  0.25602172]) array([1.02998263, 0.88191816])
  array([0.63414049, 0.63414049]) array([0.81162187, 0.61289923])]]

conditions = [array([False, False]), array([False, False]), array([ True,  True])]

choices = [array([array(['alpha'], dtype=object), array(['alpha'], dtype=object),
       array(['alpha'], dtype=object)], dtype=object), array([array([0.16134485]), array([0.11778484]), array([0.11920295])],
      dtype=object), array([array([-2.19302435,  0.57976273]),
       array([-0.86983912,  0.24081955]),
       array([-2.5218011 ,  0.25602172])], dtype=object), array([array([1.25348942, 0.77778261]), array([0.84209155, 0.84209155]),
       array([1.02998263, 0.88191816])], dtype=object), array([array([0.56136549, 0.56136549]), array([0.66394431, 0.66394431]),
       array([0.63414049, 0.63414049])], dtype=object), array([array([1.12076068, 0.53834429]), array([0.51797309, 0.51797309]),
       array([0.81162187, 0.61289923])], dtype=object)]

selected_results = np.array([np.select(conditions, choice, default=np.nan) for choice in choices])
print(selected_results)

>> [['alpha' 'alpha']
 [0.119202946 0.119202946]
 [-2.521801101837287 0.25602172377257837]
 [1.0299826279625939 0.881918155681708]
 [0.63414049 0.63414049]
 [0.8116218656784026 0.612899235]]

但是,当我有:

# Given arrays
results = [['alpha']
 [0.161344848]
 [-2.19302435146961]
 [1.2534894161924872]
 [0.5613654925053716]
 [1.120760679329349]
 ['alpha']
 [0.117784836]
 [-0.8698391195603491]
 [0.8420915464087234]
 [0.663944309731699]
 [0.517973094]
 ['alpha']
 [0.119202946]
 [-2.521801101837287]
 [1.0299826279625939]
 [0.63414049]
 [0.8116218656784026]]

conditions = [array([False]), array([False]), array([ True])]

choices = [array(['alpha', 0.161344848, -2.19302435146961, 1.2534894161924872,
       0.5613654925053716, 1.120760679329349, 'alpha', 0.117784836,
       -0.8698391195603491, 0.8420915464087234, 0.663944309731699,
       0.517973094, 'alpha', 0.119202946, -2.521801101837287,
       1.0299826279625939, 0.63414049, 0.8116218656784026], dtype=object)]

使用 selected_results = np.array([np.select(conditions, choice, default=np.nan) for choice in choices]) 给出 ValueError: list of cases must be same length as list of conditions

预期的输出是:

>> [['alpha']
 [0.119202946]
 [-2.521801101837287]
 [1.0299826279625939]
 [0.63414049]
 [0.8116218656784026]]

我知道有一个问题形状,但我不知道如何为“selected_results”提供一个更普遍适用的简单的一两行解决方案。


问题在于,在你的第二种情况下, conditions 中有 3 个条件,但你的 choices 数组中每个元素只有 1 个选择。为了解决这个问题,需要为 choices 中的每个条件提供一个选择。

你可以通过将你的单个 choice 数组分成多个大小相等的块来实现。由于你有 3 个条件,因此你应该将 choice 数组分成 3 个相等的块,每个块代表一个条件的选择。

以下是如何做到这一点:

import numpy as np

results = ['alpha', 0.161344848, -2.19302435146961, 1.2534894161924872, 0.5613654925053716, 1.120760679329349, 
           'alpha', 0.117784836, -0.8698391195603491, 0.8420915464087234, 0.663944309731699, 0.517973094, 
           'alpha', 0.119202946, -2.521801101837287, 1.0299826279625939, 0.63414049, 0.8116218656784026]

conditions = np.array([False, False, True])

# 将 choices 数组分成 3 个相等的块
choices = np.array_split(results, len(conditions))

# 使用 np.select 选择每个块中相应条件的值
selected_results = np.array([np.select([conditions[i]], [choice], default=np.nan) for i, choice in enumerate(choices)])

# 将结果展平为一维数组
selected_results = selected_results.flatten()

print(selected_results)

这将输出预期的结果:

['alpha' 0.119202946 -2.521801101837287 1.0299826279625939
 0.63414049 0.8116218656784026]

这个解决方案通过将 choices 数组拆分为每个条件对应一个块来解决数组形状问题。然后,它使用 np.select 为每个条件选择相应的块,并生成预期结果的一维数组。

标签:python,numpy
From: 78804925

相关文章

  • Python Discord Bot 的应用程序命令的区域设置名称(多语言别名)
    如何根据用户的语言设置,使应用程序命令的名称具有不同的名称例如,如果一个用户将其discord的语言设置为英语,则用户可以看到英语的应用程序命令名称。另一方面,如果另一个用户将其不和谐语言设置为法语,则用户可以看到法语中的相同应用程序命令的名称。为此,我尝试使用ap......
  • 如何在Python中添加热键?
    我正在为游戏制作一个机器人,我想在按下热键时调用该函数。我已经尝试了一些解决方案,但效果不佳。这是我的代码:defstart():whileTrue:ifkeyboard.is_pressed('alt+s'):break...defmain():whileTrue:ifkeyboard.is_pr......
  • 在Python中解压文件
    我通读了zipfile文档,但不明白如何解压缩文件,只了解如何压缩文件。如何将zip文件的所有内容解压缩到同一目录中?importzipfilewithzipfile.ZipFile('your_zip_file.zip','r')aszip_ref:zip_ref.extractall('target_directory')将......
  • 如何在Python中从RSA公钥中提取N和E?
    我有一个RSA公钥,看起来像-----BEGINPUBLICKEY-----MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAvm0WYXg6mJc5GOWJ+5jkhtbBOe0gyTlujRER++cvKOxbIdg8So3mV1eASEHxqSnp5lGa8R9Pyxz3iaZpBCBBvDB7Fbbe5koVTmt+K06o96ki1/4NbHGyRVL/x5fFiVuTVfmk+GZNakH5dXDq0fwvJyVmUtGYA......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • numpy meshgrid 的奇怪行为
    Python代码importnumpyasnpdefmesh(l):g=np.array(np.meshgrid(*l))returnnp.moveaxis(g,0,-1)mesh([[1,2],[3,4],[5,6]])给出输出array([[[[1,3,5],[1,3,6]],[[2,3,5],[2,3,6]]],[[[1,4,5],......
  • 使用 Matplotlib 的 Python 代码中出现意外的控制流
    Ubuntu22.04上的此Python3.12代码的行为符合预期,除非我按q或ESC键退出。代码如下:importnumpyasnp,matplotlib.pyplotaspltfrompathlibimportPathfromcollectionsimportnamedtuplefromskimage.ioimportimreadfrommatplotlib.widgets......
  • 参考 - Python 类型提示
    这是什么?这是与在Python中使用类型提示主题相关的问题和答案的集合。这个问题本身就是一个社区维基;欢迎大家参与维护。这是为什么?Python类型提示是一个不断增长的话题,因此许多(可能的)新问题已经被提出,其中许多甚至已经有了答案。该集合有助于查找现有内容。范......
  • 我的 Python 程序中解决 UVa 860 的运行时错误 - 熵文本分析器
    我正在尝试为UVa860编写一个解决方案,但是当我通过vJudge发送它时,它一直显示“运行时错误”。fromsysimportstdinimportmathdefmain():end_of_input=Falselambda_words=0dictionary={}text_entropy=0relative_entropy=0whilenotend_of_in......
  • Python进度条
    当我的脚本正在执行某些可能需要时间的任务时,如何使用进度条?例如,一个需要一些时间才能完成并在完成后返回True的函数。如何在函数执行期间显示进度条?请注意,我需要实时显示进度条,所以我不知道该怎么办。我需要thread为此吗?我不知道。现在在执行函数......