【问题标题】:Split numpy array into sub-arrays based on conditions根据条件将numpy数组拆分为子数组
【发布时间】:2014-11-28 07:19:33
【问题描述】:

我有两个包含每日值和时间步长的 numpy 数组:

A = [[ 0.1   0.05  0.05  0.05  0.1   0.1   0.1   0.1   0.1   0.1   0.1   0.1 .......]]

T = [['19730101' '19730102' '19730103' '19730104' '19730105' '19730106' ....... '19931231']]

并希望将A 拆分为每个月的子数组,例如:

s = numpy.split(A,condition) # condition is when there is a change in month index in T

我不清楚如何跟踪每月数字索引的变化。任何建议将不胜感激。

【问题讨论】:

  • T的值在变化还是在增加???
  • 增加一个月(以天为单位),但多年来一直在变化并保持相同的格式%y4%m2%d2,例如19730101

标签: python arrays python-2.7 numpy


【解决方案1】:

我认为应该这样做。 使用 numpy 可能有一种更快/更简洁的方法,但我认为这非常简单。

A = [0.1,   0.05,  0.05,  0.05,  0.1,   0.1,   0.1]
T = ['19730101', '19730102', '19730103', '19730104', '19730105', '19730106', '19931231']

combined = zip(A, T)
combined = sorted(combined, key=lambda x: x[1]) # Sort on timestamp

splits = []
current_month = None
for a, t in combined:
    month = t[4:6]
    print month
    if not month == current_month:
        splits.append([a,]) # Add new split
        current_month = month
    else:
        splits[-1].append(a) # Add to current split
print splits

【讨论】:

  • 它仍然是单个数组。没有分裂
  • 我忘记在月份更改时更改current_month。它现在可以工作,只要 A 和 T 是相同长度的一维数组。
  • 奇怪,还是单个数组
  • 查看包含示例数据的更新代码。请注意,由于您的原始数据不是 valif Pythin 代码,因此我已将 A 和 T 转换为一维列表。
  • 另外,我猜不是只检查月份,而是希望年份+月份连接?目前,“197310”和“197410”最终会出现在同一个列表中。在这种情况下,将 month=t[4:6] 更改为 yearmonth=t[:6]
【解决方案2】:

您可以使用pandas 轻松做到这一点:

>>> T = ['20140101', '20140102', '20140201', '20140202']
>>> A = [0.1, 0.2, 0.3, 0.4]
>>> s = pandas.Series(A, T)
>>> groups = s.groupby(lambda i: i[:6])
>>> for month, group in g:
...     print(month)
...     print(group)
201401
20140101    0.1
20140102    0.2
dtype: float64
201402
20140201    0.3
20140202    0.4
dtype: float64

或者你可以使用纯python,虽然它可能效率较低:

>>> groups = {}
>>> for t, a in zip(T, A):
...     month = t[:6]
...     groups.setdefault(month, []).append(a))
>>> for month, group in groups.items():
...     print(month)
...     print(group)
201402
[('20140201', 0.3), ('20140202', 0.4)]
201401
[('20140101', 0.1), ('20140102', 0.2)]

【讨论】:

  • 纯python方式收到错误:TypeError: unhashable type: 'numpy.ndarray'
  • 我没有收到错误。你是如何创建数组的?它们是一维的还是二维的?您问题中的 [[..]] 建议使用 2D,尽管数据仅为 1D。如果您有 2D 数组,那将是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多