numpy比较如何工作

时间:2019-03-15 19:05:00

标签: python numpy

我是该领域的新手,该脚本用于将80%的数据随机获取到训练列表中,其余的20%从测试列表中获取。该脚本有效,但是我对它为什么起作用有一些疑问。 如果len(data)为1000,则randn(1000)将生成具有正态分布的1000个随机数。我不明白的是: 1)我测试了自己,例如[1,2,3,4,5,6,7,8,9,10] <5我得到一个错误,因为左运算符是一个列表。但是为什么check = a <0.8合法,a应该是1000个元素的列表?

import pandas as pd
import numpy as np 
data = pd.read_csv('E:/Personal/Learning/Datasets/Book/Customer ChurnModel.txt')
len(data)
a=np.random.randn(len(data))
check=a<0.8
training=data[check]
testing=data[~check]

3 个答案:

答案 0 :(得分:4)

NumPy数组使比较运算符超载,以按元素而不是按容器执行操作。

换句话说,

check=a<0.8

将创建一个新的NumPy数组check,其长度与a相同,这样:

check[i] = a[i] < 0.8

答案 1 :(得分:0)

好检查变量用作布尔对象,在代码中,该行仅是赋值。 另一方面,与两个对象的比较必须是同一类型。 type([1,2,3,4,5,6,7,8,9,10])->'列表'对象 type(5)->'int'对象

答案 2 :(得分:0)

list等内置类型相反,numpy数组通过重写比较运算符来利用Python丰富的比较系统。这是为了允许与原子类型,类似numpy数组的类型等进行比较。丰富的比较运算符返回新数组(而不只是TrueFalse)。

任何人都可以编写does custom comparisons类似于numpy数组的类。

有用的提示:如果您使用functools.total_ordering,则只需provide two methods,例如__eq____lt__

import functools

@functools.total_ordering
class Mine:
    def __eq__(self, other):
        ...
    def __lt__(self, other):
        ...

当您为这两种方法提供正确的行为时,其余方法将自动进行排序。但是在实践中,要使一类按您希望的方式工作,通常会发现需要自定义其他丰富比较方法的行为:__ne____gt____le__,和__ge__