当前位置: 首页 > 知识库问答 >
问题:

基于间隔的Numpy/Pandas切片

贺景铄
2023-03-14

试图找出一种方法来分割pandas/numpy矩阵中非连续和非等长的行,以便将这些值设置为公共值。有没有人想出一个优雅的解决方案?

import numpy as np
import pandas as pd
x = pd.DataFrame(np.arange(12).reshape(3,4))
#x is the matrix we want to index into

"""
x before:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
"""
y = pd.DataFrame([[0,3],[2,2],[1,2],[0,0]]) 
#y is a matrix where each row contains a start idx and end idx per column of x

"""
   0  1
0  0  3
1  2  3
2  1  3
3  0  1
"""

我要寻找的是一种基于y行有效选择不同长度x切片的方法

x[y] = 0 
"""
x afterwards:
array([[ 0,  1,  2,  0],
       [ 0,  5,  0,  7],
       [ 0,  0,  0, 11]])

共有2个答案

周和志
2023-03-14

我为您的问题定制了以下答案:

y_t = y.values.transpose()
y_t[1,:] = y_t[1,:] - 1 # or remove this line and change '>= r' below to '> r`

r = np.arange(x.shape[0])

mask = ((y_t[0,:,None] <= r) & (y_t[1,:,None] >= r)).transpose()

res = x.where(~mask, 0)
res
#     0   1   2   3
# 0   0   1   2   0
# 1   0   5   0   7
# 2   0   0   0   11
陆飞捷
2023-03-14

屏蔽仍然是有用的,因为即使不能完全避免循环,主数据帧x也不需要参与循环,因此这应该会加快速度:

mask = np.zeros_like(x, dtype=bool)

for i in range(len(y)):
    mask[y.iloc[i, 0]:(y.iloc[i, 1] + 1), i] = True
    
x[mask] = 0
x
    0   1   2   3
0   0   1   2   0
1   0   5   0   7
2   0   0   0   11

作为进一步的改进,考虑如果可能的话,定义<代码> y>代码>作为一个编号数组。

 类似资料:
  • 问题内容: 我有一个时序数据帧,看起来像这样(时间序列 发生在同一天,但跨越了不同的时间: 从开始,我需要每5分钟创建一个小组。这是所有与该范围内的行向,其新列的值是1(行的每个组内的编号是不规则的,所以我不能简单地切断基团) 最终,数据应如下所示: 目的是执行一些操作,但是我需要做的操作未包含在方法中。因此,我必须创建一列以标识每个组,然后执行。 任何帮助或评论都将受到高度赞赏。 谢谢! 问题答

  • 我偶然发现了这个不错的教程https://github.com/manashmndl/DeadSimpleSpeechRecognizer其中数据是基于由文件夹分隔的样本进行训练的,所有mfcc都是一次计算的。 我正试图以不同的方式实现类似的目标。 基于此:https://librosa.github.io/librosa/generated/librosa.feature.mfcc.html l

  • 我正在用chartjs绘制一个图形,其中x轴表示时间,y轴表示相应的数据。 现在我得到了今天、上周、上月和去年的数据。 }; 当我绘制图形时,每个点之间的距离是相同的。但这是不正确的,因为时间间隔不相同。 “去年”和“上月”之间的距离应大于“上周”和“上个月”之间的间隔。 任何人一个想法如何我可以实现这与chartjs,当我看留档我没有看到任何选项。

  • 主要内容:创建数组,布尔索引,重塑数组形状,Pdans与NumPy区别,转换ndarray数组我们知道 Pandas 是在 NumPy 的基础构建而来,因此,熟悉 NumPy 可以更加有效的帮助我们使用 Pandas。 NumPy 主要用 C语言编写,因此,在计算还和处理一维或多维数组方面,它要比 Python 数组快得多。关于 NumPy 的学习,可以参考《 Python NumPy教程》。 创建数组 数组的主要作用是在一个变量中存储多个值。NumPy 可以轻松地处理多维数组,示例如下:

  • 我知道,如果延迟且其所属窗口关闭,则默认情况下将删除延迟事件<我想问一下,基于事件时间的连接间隔如何?水印的确切行为/效果是什么?最近的活动会取消吗?

  • Python 的内置容器对象,例如列表,可以通过索引或切片来访问和修改。这在 ndarray 对象中也一样,ndarray 对象中的元素遵循基于零的索引,常用的索引方式:元素访问、切片索引、布尔型索引。 1. 元素访问 1.1 单一元素访问 一维数组的元素访问非常简单,和 Python 列表规则基本差不多。对单一元素的访问,索引遵循从 0 开始,依次递增 1。 案例 例如,对于创建的一维数组,我们