小编tri*_*ook的帖子

替换NumPy中的迭代

我正在尝试重写以下例程(a,b,c,d和e都是数组):

def generate_a(b, c, e):
    a = np.zeros_like(b)
    d = np.zeros_like(b)
    for i in range(a.size):
        a[i] = (b[i] / c[i]) + d[i-1]
        d[i] = a[i] * e[i]
    return a
Run Code Online (Sandbox Code Playgroud)

不使用'for'循环,因为例程需要运行数百万次.这是一个小技巧,因为d中任何给定单元格的值取决于为a中的单元格计算的结果,而该结果又取决于为d计算的最后一个值.关于如何在没有迭代的情况下完成此任务的任何想法?

python arrays recursion numpy vectorization

3
推荐指数
1
解决办法
143
查看次数

numpy.arange 的日期时间间隔

我想创建每月间隔而不使用 np.arange 进行迭代。作为一个简单的示例,我想要一个包含 np.datetime64 对象的数组,表示 1990-2000 范围内的元旦。我想是这样的:

np.arange(np.datetime64("1990-01-01"), np.datetime64("2000-01-01"), np.timedelta64(1, 'M'), dtype='datetime64[D]')
Run Code Online (Sandbox Code Playgroud)

但这会引发错误

TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'
Run Code Online (Sandbox Code Playgroud)

如果我将 dtype 切换为 datetime[M],我会得到月份的数组,但我当然想要日期。

python numpy

3
推荐指数
1
解决办法
3386
查看次数

屏蔽列名等于索引的单元格(pandas)

我想屏蔽 Pandas DataFrame 中的值,其中索引与列名相同。例如:

import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape((4, 3)),
                 index=["a", "b", "c", "d"],
                 columns=["a", "b", "c"])

   a   b   c
a  0   1   2
b  3   4   5
c  6   7   8
d  9  10  11
Run Code Online (Sandbox Code Playgroud)

屏蔽后:

   a   b   c
a NaN  1   2
b  3  NaN  5
c  6   7  NaN
d  9  10  11
Run Code Online (Sandbox Code Playgroud)

看起来很简单,但我不确定如何以 Pythonic 方式做到这一点,而不需要迭代。

python pandas

3
推荐指数
1
解决办法
875
查看次数

numpy.argmin表示元素大于阈值

我有兴趣在满足特定条件的一维NumPy数组中获取最小值的位置(在我的情况下,中等阈值).例如:

import numpy as np

limit = 3
a = np.array([1, 2, 4, 5, 2, 5, 3, 6, 7, 9, 10])
Run Code Online (Sandbox Code Playgroud)

我想有效地掩盖所有在a极限以下的数字,这样结果np.argmin将是6.是否有一种计算上廉价的方法来掩盖不符合条件的值然后应用np.argmin

python arrays performance numpy

2
推荐指数
2
解决办法
3087
查看次数

多个系列与另一个系列的条件乘法

我想根据第三列中的条件,将DataFrame的一列中的值乘以另一列中的值.例如:

data = pd.DataFrame({'a': [1, 33, 56, 79, 2], 'b': [9, 12, 14, 5, 5], 'c': np.arange(5)})
data.loc[data.a > 10, ['a', 'b']] *= data.loc[data.a > 10, 'c']
Run Code Online (Sandbox Code Playgroud)

我想要做的是根据条件将'a'和'b'的值乘以'c'中的相应(相同行)值.但是,上述代码只会导致NaN值在所需范围内.

我发现最接近的解决方法是这样做:

data.loc[data.a > 10, ['a', 'b']] = (data.loc[data.a > 10, ['a', 'b']].as_matrix().T * data.loc[data.a > 10, 'c']).T
Run Code Online (Sandbox Code Playgroud)

这是有效的,但似乎有一种更好的(更多的Pythonic)方式,我错过了.

python numpy dataframe pandas

2
推荐指数
1
解决办法
124
查看次数

忽略“usecol”参数中缺少的列

我正在从 csv 读取表格,并且只想要列的子集。我用于子集的列表包含我正在阅读的表中可能不存在的字段名称。例如:

# contents of sample.csv:
#a,b,c
#1,2,3
#4,5,6

subset = ['a', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)

我想使用 pandas.read_csv 和子集返回以下内容,但这会引发错误:

pd.read_csv(sample.csv, usecols=subset)
a  c
1  3
4  6

ValueError: Usecols do not match columns, columns expected but not found: ['d']
Run Code Online (Sandbox Code Playgroud)

我想我可能可以使用 usecols 的可调用值,但我不确定如何实现。

python pandas

2
推荐指数
1
解决办法
542
查看次数

按pandas中的列名重新分类

我想将测试应用于pandas数据帧,并根据测试结果在相应的数据帧中创建标记.我到目前为止:

import numpy as np
import pandas as pd


matrix = pd.DataFrame({'a': [1, 11, 2, 3, 4], 'b': [5, 6, 22, 8, 9]})
flags = pd.DataFrame(np.zeros(matrix.shape), columns=matrix.columns)
flag_values = pd.Series({"a": 100, "b": 200})

flags[matrix > 10] = flag_values 
Run Code Online (Sandbox Code Playgroud)

但这会引发错误

ValueError: Must specify axis=0 or 1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在哪里可以指定轴?有没有更好的方法来实现这一目标?

编辑:

我在这个例子中寻找"标志"的结果是

a    b
0    0
100  0
0    200
0    0
0    0
Run Code Online (Sandbox Code Playgroud)

python pandas numpy-broadcasting

1
推荐指数
1
解决办法
119
查看次数

使用GDAL处理文件地理数据库(.gdb)中的栅格

我正在开发一个工具,可以将栅格图层转换为数组,以便使用NumPy进行处理,理想情况下,我希望能够使用.gdb中打包的栅格而不将它们全部导出(特别是如果这需要使用ArcGIS或ArcPy) ).

这可以通过OpenFileGDB驱动程序实现吗?据我所知,这个驱动程序似乎将栅格图层视为与矢量图层相同,这使您可以访问有关图层的一些数据,但不会为您提供ReadAsArray功能.

python gdal

0
推荐指数
2
解决办法
1658
查看次数