如果想快速解决问题,那么是列表直接使用方法(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