python的random.shuffle使用存在的问题

如果想快速解决问题,那么是列表直接使用方法(1),如果是numpy.array()请使用方法(2)。

欲知区别和原因,请仔细看下面的分析:

首先需要区分两个random.shuffle()使用方法,一个是random中的,一个是numpy自带的。

(1)使用random带的random.shuffle()

使用方法:

                 import random

                 random.shuffle()

下面首先看一个例子,例子很简单,就是加载csv文件,读取文件,数据格式化,使用numpy处理文件变为对应的格式(通俗地理解就是变成对应的数组格式),然后使用random.shuffle()对数组随机排序一下。

#coding:utf-8
#author:zgd

import pandas as pd
import numpy as np
import random

urls = 't1.csv'	#path to our all urls file
urlscsv = pd.read_csv(urls)	#reading file
print urlscsv
urlsdata = pd.DataFrame(urlscsv)	#converting to a dataframe
print "1",urlsdata

urlsdata = np.array(urlsdata)	#converting it into an array
print "2", urlsdata
random.shuffle(urlsdata)	#或者使用 np.random.shuffle(urlsdata)
print "3", urlsdata


接下来出现了奇怪的事情,下面先给出后“2”和“3”的输出结果:

通过结果可以看出并没有对每一行进行随机啊,而是出现了重复的情况。

接下来查看一下源码:

问题就出在上图中被红线标记的这一行。这一行会导致出现上面的错误。

写个代码测试一下:

import numpy
import random
n = [[1,2,3],[4,5,6]]
m = numpy.array([[1,2,3],[4,5,6]])
random.shuffle(n)
random.shuffle(m)
t = numpy.array([[1,2,3],[4,5,6]])
t[0],t[1] = t[1],t[0]

print "n:",n
print "m:",m
print "t:",t

输出结果:

###第一次
n: [[1, 2, 3], [4, 5, 6]]
m: [[1 2 3]
 [1 2 3]]
t: [[4 5 6]
 [4 5 6]]

###第二次
n: [[1, 2, 3], [4, 5, 6]]
m: [[1 2 3]
 [4 5 6]]
t: [[4 5 6]
 [4 5 6]]

从上面测试可以看出,random.shuffle()针对list列表每次都能正常使用随机序列,针对numpy.array()的数组随机结果时好时坏!

通过对random.shuffle()源码的x[i], x[j] = x[j], x[i]分析发现每次输出都是不好的。所以使用numpy.array()和使用x[i], x[j] = x[j], x[i]还是有区别的。原因在于random.shuffle()代码中的j也是随机的。

(2)使用numpy自带的random.shuffle()

使用方法:

            import numpy

            numpy.random.shuffle()

这次使用之后发现结果一切正常了。

下面看下对应的源码:

    def shuffle(self, x): # real signature unknown; restored from __doc__
        """
        shuffle(x)
        
                Modify a sequence in-place by shuffling its contents.
        
                This function only shuffles the array along the first axis of a
                multi-dimensional array. The order of sub-arrays is changed but
                their contents remains the same.
        
                Parameters
                ----------
                x : array_like
                    The array or list to be shuffled.
        
                Returns
                -------
                None
        
                Examples
                --------
                >>> arr = np.arange(10)
                >>> np.random.shuffle(arr)
                >>> arr
                [1 7 5 2 9 4 3 6 0 8]
        
                Multi-dimensional arrays are only shuffled along the first axis:
        
                >>> arr = np.arange(9).reshape((3, 3))
                >>> np.random.shuffle(arr)
                >>> arr
                array([[3, 4, 5],
                       [6, 7, 8],
                       [0, 1, 2]])
        """
        pass

  参考链接:https://blog.csdn.net/qq_21063873/article/details/80860218

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值