深入学习java源码之Character.Subset与Character.UnicodeBlock

深入学习java源码之Character.Subset与Character.UnicodeBlock

hashMap的加载因子

new HashMap<>(128);

    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

加载因子 loadfactor

     /**
     * 默认的初始化的容量,必须是2的幂次数<br>
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 16;

    /**
     * 默认的加载因子
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

    /**
     * 阈值。等于容量乘以加载因子。<br>
     * 也就是说,一旦容量到了这个数值,HashMap将会扩容。
     * The next size value at which to resize (capacity * load factor).
     * @serial
     */
    int threshold;

加载因子越高   空间利用率提高了  但是查询时间 和添加时间增加

加载因子 loadfactor 是表示 Hsah 表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.

冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.

因此,必须在 “冲突的机会”与”空间利用率”之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的”时-空”矛盾的平衡与折衷.
默认的容量是 16,而 threshold 是 16*0.75 = 12;

hashmap 是这样存的

先利用hashcode  找到需要存的地方
但是 存的地方肯定是有限的 就是hashMap分配到的空间  比如是  10
现在你 第一个元素来了 那么他会根据 你 hashcode%10 得到你 在 10个位置中该存到哪里


这个时候就有一个问题,就是,如果hashcode%10 找到存的地方   当你要存进去时候 你发现里面已经有另外一个对象了,
那么这时候就要调用 equals方法 进行比较,如果相同,就说明是一个相同的对象。就替换掉。
如果不同,那么就 形成散列桶,  就是2个对象一起, 不过有先后, 后进来的 在后面。

hashmap 查询对象,要的是效率,直接通过hashcode找到存放的地址,直接取出,只需一次。
但是像我们前面说的这种情况,是会让操作数增加的,
你找到了 hashcode 所对应的物理地址,发现里面有2个对象, 这时就不能确定那个是你要找的,那么就要通过equals和你传入的key进行比对,相同 则返回。

前面的讲述已经发现  当你空间只有仅仅为10的时候 是很容易造成,2个对象的hashcode 所对应的地址是一个位置的情况
这样就造成 2个 对象 会形成散列桶,使查询和插入的时间增加。

这时就有一个加载因子的参数,如果加载因子为0.75 ,如果你hashmap的 空间有 100  那么  当你插入了75个元素的时候 hashmap就需要扩容了,不然的话 会形成很长散列桶 , 对于查询和插入都会增加时间,因为 他要一个一个的equals。
但是你又不能让加载因子很小,0.01 这样是不合适的,因为 他会大大消耗你的 内存, 你一加入一个对象hashmap就扩容。

 

java的enum枚举

原始的接口定义常量

public interface IConstants {
    String MON = "Mon";
    String TUE = "Tue";
    String WED = "Wed";
    String THU = "Thu";
    String FRI = "Fri";
    String SAT = "Sat";
    String SUN = "Sun";
}

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
    ... ...
public class Test {
    public static void main(String[] args) {
        for (EnumTest e : EnumTest.values()) {
            System.out.println(e.toString());
        }
         
        System.out.println("----------------我是分隔线------------------");
         
        EnumTest test = EnumTest.TUE;
        switch (test) {
        case MON:
            System.out.println("今天是星期一");
            break;
        case TUE:
            System.out.println("今天是星期二");
            break;
        // ... ...
        default:
            System.out.println(test);
            break;
        }
    }
}


MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二

 可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

enum 对象的常用方法介绍

int compareTo(E o) 
          比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass() 
          返回与此枚举常量的枚举类型相对应的 Class 对象。

String name() 
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal() 
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString()

           返回枚举常量的名称,它包含在声明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回带指定名称的指定枚举类型的枚举常量。

public class Test {
    public static void main(String[] args) {
        EnumTest test = EnumTest.TUE;
         
        //compareTo(E o)
        switch (test.compareTo(EnumTest.MON)) {
        case -1:
            System.out.println("TUE 在 MON 之前");
            break;
        case 1:
            System.out.println("TUE 在 MON 之后");
            break;
        default:
            System.out.println("TUE 与 MON 在同一位置");
            break;
        }
         
        //getDeclaringClass()
        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());
         
        //name() 和  toString()
        System.out.println("name(): " + test.name());
        System.out.println("toString(): " + test.toString());
         
        //ordinal(), 返回值是从 0 开始
        System.out.println("ordinal(): " + test.ordinal());
    }
}



TUE 在 MON 之后
getDeclaringClass(): com.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1

 

 

Modifier and TypeMethod and Description
static intcharCount(int codePoint)

确定代表指定字符(Unicode代码点)所需的 char值。

charcharValue()

返回此 Character对象的值。

static intcodePointAt(char[] a, int index)

返回 char数组的给定索引处的代码点。

static intcodePointAt(char[] a, int index, int limit)

返回 char数组的给定索引处的代码点,其中只能使用 index小于 limit数组元素。

static intcodePointAt(CharSequence seq, int index)

返回 CharSequence给定索引处的代码点。

static intcodePointBefore(char[] a, int index)

返回 char阵列给定索引之前的代码点。

static intcodePointBefore(char[] a, int index, int start)

返回 char阵列给定索引之前的代码点,只能使用 index大于等于 start数组元素。

static intcodePointBefore(CharSequence seq, int index)

返回的给定索引前面的代码点 CharSequence

static intcodePointCount(char[] a, int offset, int count)

返回 char数组参数的子阵列中的Unicode代码点数。

static intcodePointCount(CharSequence seq, int beginIndex, int endIndex)

返回指定字符序列的文本范围内的Unicode代码点数。

static intcompare(char x, char y)

数值比较两个 char数值。

intcompareTo(Character anotherCharacter)

数字比较两个 Character对象。

static intdigit(char ch, int radix)

返回指定基数中字符 ch的数值。

static intdigit(int codePoint, int radix)

返回指定基数中指定字符(Unicode代码点)的数值。

booleanequals(Object obj)

将此对象与指定对象进行比较。

static charforDigit(int digit, int radix)

确定指定基数中特定数字的字符表示。

static bytegetDirectionality(char ch)

返回给定字符的Unicode方向属性。

static bytegetDirectionality(int codePoint)

返回给定字符的Unicode方向性属性(Unicode代码点)。

static StringgetName(int codePoint)

返回指定字符的Unicode名称 codePoint ,或者如果代码点是空 unassigned

static intgetNumericValue(char ch)

返回指定的Unicode字符代表的 int值。

static intgetNumericValue(int codePoint)

返回 int值指定字符(Unicode代码点)表示。

static intgetType(char ch)

返回一个值,表示一个字符的一般类别。

static intgetType(int codePoint)

返回一个值,表示一个字符的一般类别。

inthashCode()

返回这个Character的哈希码; 等于调用charValue()的结果。

static inthashCode(char value)

返回一个char值的哈希码; 兼容Character.hashCode()

static charhighSurrogate(int codePoint)

返回主导替代(一个 high surrogate code unit所述的) surrogate pair表示在UTF-16编码指定的补充的字符(Unicode代码点)。

static booleanisAlphabetic(int codePoint)

确定指定的字符(Unicode代码点)是否是字母表。

static booleanisBmpCodePoint(int codePoint)

确定指定的字符(Unicode代码点)是否在 Basic Multilingual Plane (BMP)中

static booleanisDefined(char ch)

确定字符是否以Unicode定义。

static booleanisDefined(int codePoint)

确定Unicode中是否定义了一个字符(Unicode代码点)。

static booleanisDigit(char ch)

确定指定的字符是否是数字。

static booleanisDigit(int codePoint)

确定指定的字符(Unicode代码点)是否为数字。

static booleanisHighSurrogate(char ch)

确定给定的 char值是否为 Unicode high-surrogate code unit (也称为 引导代理单元 )。

static booleanisIdentifierIgnorable(char ch)

确定指定的字符是否应被视为Java标识符或Unicode标识符中的可忽略字符。

static booleanisIdentifierIgnorable(int codePoint)

确定指定字符(Unicode代码点)是否应被视为Java标识符或Unicode标识符中的可忽略字符。

static booleanisIdeographic(int codePoint)

确定指定字符(Unicode代码点)是否是Unicode标准定义的CJKV(中文,日文,韩文和越南文)表意文字。

static booleanisISOControl(char ch)

确定指定的字符是否是ISO控制字符。

static booleanisISOControl(int codePoint)

确定引用的字符(Unicode代码点)是否是ISO控制字符。

static booleanisJavaIdentifierPart(char ch)

确定指定的字符是否可以是Java标识符的一部分,而不是第一个字符。

static booleanisJavaIdentifierPart(int codePoint)

确定字符(Unicode代码点)可能是Java标识符的一部分,而不是第一个字符。

static booleanisJavaIdentifierStart(char ch)

确定指定字符是否允许作为Java标识符中的第一个字符。

static booleanisJavaIdentifierStart(int codePoint)

确定字符(Unicode代码点)是否允许作为Java标识符中的第一个字符。

static booleanisJavaLetter(char ch)已弃用

替换为isJavaIdentifierStart(char)。

static booleanisJavaLetterOrDigit(char ch)已弃用

由isJavaIdentifierPart(char)替代。

static booleanisLetter(char ch)

确定指定的字符是否是一个字母。

static booleanisLetter(int codePoint)

确定指定的字符(Unicode代码点)是否是一个字母。

static booleanisLetterOrDigit(char ch)

确定指定的字符是字母还是数字。

static booleanisLetterOrDigit(int codePoint)

确定指定的字符(Unicode代码点)是字母还是数字。

static booleanisLowerCase(char ch)

确定指定的字符是否是小写字符。

static booleanisLowerCase(int codePoint)

确定指定的字符(Unicode代码点)是否是小写字符。

static booleanisLowSurrogate(char ch)

确定给定的 char值是否为 Unicode low-surrogate code unit (也称为 尾随代理单元 )。

static booleanisMirrored(char ch)

根据Unicode规范确定字符是否镜像。

static booleanisMirrored(int codePoint)

确定是否根据Unicode规范镜像指定的字符(Unicode代码点)。

static booleanisSpace(char ch)已弃用

替换为isWhitespace(char)。

static booleanisSpaceChar(char ch)

确定指定的字符是否是Unicode空格字符。

static booleanisSpaceChar(int codePoint)

确定指定字符(Unicode代码点)是否为Unicode空格字符。

static booleanisSupplementaryCodePoint(int codePoint)

确定指定字符(Unicode代码点)是否在 supplementary character范围内。

static booleanisSurrogate(char ch)

确定给定的 char值是否是Unicode 代理代码单元

static booleanisSurrogatePair(char high, char low)

确定指定的一对 char值是否有效 Unicode surrogate pair

static booleanisTitleCase(char ch)

确定指定的字符是否是一个titlecase字符。

static booleanisTitleCase(int codePoint)

确定指定的字符(Unicode代码点)是否是一个titlecase字符。

static booleanisUnicodeIdentifierPart(char ch)

确定指定的字符是否可以是Unicode标识符的一部分,而不是第一个字符。

static booleanisUnicodeIdentifierPart(int codePoint)

确定指定的字符(Unicode代码点)是否可能是Unicode标识符的一部分,而不是第一个字符。

static booleanisUnicodeIdentifierStart(char ch)

确定指定字符是否允许为Unicode标识符中的第一个字符。

static booleanisUnicodeIdentifierStart(int codePoint)

确定Unicode标识符中的第一个字符是否允许指定的字符(Unicode代码点)。

static booleanisUpperCase(char ch)

确定指定的字符是否为大写字符。

static booleanisUpperCase(int codePoint)

确定指定的字符(Unicode代码点)是否为大写字符。

static booleanisValidCodePoint(int codePoint)

确定指定的代码点是否有效 Unicode code point value

static booleanisWhitespace(char ch)

根据Java确定指定的字符是否为空格。

static booleanisWhitespace(int codePoint)

根据Java确定指定字符(Unicode代码点)是否为空格。

static charlowSurrogate(int codePoint)

返回尾随替代(一个 low surrogate code unit所述的) surrogate pair表示在UTF-16编码指定的补充的字符(Unicode代码点)。

static intoffsetByCodePoints(char[] a, int start, int count, int index, int codePointOffset)

返回给定的 char子阵列中的索引,该子阵列与 indexcodePointOffset代码点偏移。

static intoffsetByCodePoints(CharSequence seq, int index, int codePointOffset)

返回给定的char序列中与 indexcodePointOffset代码点偏移的索引。

static charreverseBytes(char ch)

返回通过反转指定的 char值中的字节顺序获得的值。

static char[]toChars(int codePoint)

将指定的字符(Unicode代码点)转换为存储在 char数组中的UTF-16 char形式。

static inttoChars(int codePoint, char[] dst, int dstIndex)

将指定的字符(Unicode代码点)转换为其UTF-16表示形式。

static inttoCodePoint(char high, char low)

将指定的代理对转换为其补充代码点值。

static chartoLowerCase(char ch)

使用UnicodeData文件中的大小写映射信息将字符参数转换为小写。

static inttoLowerCase(int codePoint)

使用UnicodeData文件中的大小写映射信息将字符(Unicode代码点)参数转换为小写。

StringtoString()

返回 String表示此对象 Character的价值。

static StringtoString(char c)

返回一个 String对象,表示指定的 char

static chartoTitleCase(char ch)

使用UnicodeData文件中的案例映射信息将字符参数转换为titlecase。

static inttoTitleCase(int codePoint)

使用UnicodeData文件中的案例映射信息将字符(Unicode代码点)参数转换为titlecase。

static chartoUpperCase(char ch)

使用UnicodeData文件中的案例映射信息将字符参数转换为大写。

static inttoUpperCase(int codePoint)

使用UnicodeData文件中的案例映射信息将字符(Unicode代码点)参数转换为大写。

static CharactervalueOf(char c)

返回一个 表示指定的 char值的 Character实例。

java源码

package java.lang;

import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.Locale;


public final
class Character implements java.io.Serializable, Comparable<Character> {

    public static final int MIN_RADIX = 2;

    public static final int MAX_RADIX = 36;
	
    public static final char MIN_VALUE = '\u0000';	
	
    public static final char MAX_VALUE = '\uFFFF';
	
    @SuppressWarnings("unchecked")
    public static final Class<Character> TYPE = (Class<Character>) Class.getPrimitiveClass("char");

    public static final byte UNASSIGNED = 0;

    public static final byte UPPERCASE_LETTER = 1;	

    public static final byte LOWERCASE_LETTER = 2;
	
	......
	
    public static final byte DECIMAL_DIGIT_NUMBER = 9;
	
    static final int ERROR = 0xFFFFFFFF;
	
    public static final byte DIRECTIONALITY_UNDEFINED = -1;	
	
    public static final char MIN_HIGH_SURROGATE = '\uD800';
	
    public static final char MIN_LOW_SURROGATE  = '\uDC00';
	
    public static final char MIN_SURROGATE = MIN_HIGH_SURROGATE;
	
    public static final char MAX_SURROGATE = MAX_LOW_SURROGATE;
	
    public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;

    private final char value;

    private static final long serialVersionUID = 3786198910865385080L;
	
    public Character(char value) {
        this.value = value;
    }

    private static class CharacterCache {
        private CharacterCache(){}

        static final Character cache[] = new Character[127 + 1];

        static {
            for (int i = 0; i < cache.length; i++)
                cache[i] = new Character((char)i);
        }
    }

    public static Character valueOf(char c) {
        if (c <= 127) { // must cache
            return CharacterCache.cache[(int)c];
        }
        return new Character(c);
    }

    public char charValue() {
        return value;
    }
	
    @Override
    public int hashCode() {
        return Character.hashCode(value);
    }	
	
    public static int hashCode(char value) {
        return (int)value;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Character) {
            return value == ((Character)obj).charValue();
        }
        return false;
    }
	
    public String toString() {
        char buf[] = {value};
        return String.valueOf(buf);
    }

    public static String toString(char c) {
        return String.valueOf(c);
    }
	
    public static int getType(char ch) {
        return getType((int)ch);
    }

    public static int getType(int codePoint) {
        return CharacterData.of(codePoint).getType(codePoint);
    }
	
    public static int compare(char x, char y) {
        return x - y;
    }	
	
    public int compareTo(Character anotherCharacter) {
        return compare(this.value, anotherCharacter.value);
    }	
	
    public static final int BYTES = SIZE / Byte.SIZE;	
	
    public static final int SIZE = 16;	
	
    public static String getName(int codePoint) {
        if (!isValidCodePoint(codePoint)) {
            throw new IllegalArgumentException();
        }
        String name = CharacterName.get(codePoint);
        if (name != null)
            return name;
        if (getType(codePoint) == UNASSIGNED)
            return null;
        UnicodeBlock block = UnicodeBlock.of(codePoint);
        if (block != null)
            return block.toString().replace('_', ' ') + " "
                   + Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
        // should never come here
        return Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
    }
	
    public static class Subset  {

        private String name;	
	
        protected Subset(String name) {
            if (name == null) {
                throw new NullPointerException("name");
            }
            this.name = name;
        }
        public final boolean equals(Object obj) {
            return (this == obj);
        }	
        public final int hashCode() {
            return super.hashCode();
        }	
        public final String toString() {
            return name;
        }
    }
	
    public static final class UnicodeBlock extends Subset {

        private static Map<String, UnicodeBlock> map = new HashMap<>(256);

        /**
         * Creates a UnicodeBlock with the given identifier name.
         * This name must be the same as the block identifier.
         */
        private UnicodeBlock(String idName) {
            super(idName);
            map.put(idName, this);
        }

        private UnicodeBlock(String idName, String alias) {
            this(idName);
            map.put(alias, this);
        }

        private UnicodeBlock(String idName, String... aliases) {
            this(idName);
            for (String alias : aliases)
                map.put(alias, this);
        }

        public static final UnicodeBlock  BASIC_LATIN =
            new UnicodeBlock("BASIC_LATIN",
                             "BASIC LATIN",
                             "BASICLATIN");		
							 
        public static final UnicodeBlock ARMENIAN =
            new UnicodeBlock("ARMENIAN");		

        public static final UnicodeBlock PHAGS_PA =
            new UnicodeBlock("PHAGS_PA",
                             "PHAGS-PA");
							 
        private static final int blockStarts[] = {
            0x0000,   // 0000..007F; Basic Latin
            0x0080,   // 0080..00FF; Latin-1 Supplement
            0x0100,   // 0100..017F; Latin Extended-A
            0x0180,   // 0180..024F; Latin Extended-B
            0x0250,   // 0250..02AF; IPA Extensions
		};

        private static final UnicodeBlock[] blocks = {
            BASIC_LATIN,
            LATIN_1_SUPPLEMENT,
            LATIN_EXTENDED_A,
            LATIN_EXTENDED_B,							 
        };	
		
        public static UnicodeBlock of(char c) {
            return of((int)c);
        }

        public static UnicodeBlock of(int codePoint) {
            if (!isValidCodePoint(codePoint)) {
                throw new IllegalArgumentException();
            }

            int top, bottom, current;
            bottom = 0;
            top = blockStarts.length;
            current = top/2;

            // invariant: top > current >= bottom && codePoint >= unicodeBlockStarts[bottom]
            while (top - bottom > 1) {
                if (codePoint >= blockStarts[current]) {
                    bottom = current;
                } else {
                    top = current;
                }
                current = (top + bottom) / 2;
            }
            return blocks[current];
        }	

        public static final UnicodeBlock forName(String blockName) {
            UnicodeBlock block = map.get(blockName.toUpperCase(Locale.US));
            if (block == null) {
                throw new IllegalArgumentException();
            }
            return block;
        }		
}							 

    public static enum UnicodeScript {
        /**
         * Unicode script "Common".
         */
        COMMON,

        /**
         * Unicode script "Latin".
         */
        LATIN,

        /**
         * Unicode script "Greek".
         */
        GREEK,
		/**
         * Unicode script "Takri".
         */
        TAKRI,

        /**
         * Unicode script "Miao".
         */
        MIAO,

        /**
         * Unicode script "Unknown".
         */
        UNKNOWN;

        private static final int[] scriptStarts = {
            0x0000,   // 0000..0040; COMMON
            0x0041,   // 0041..005A; LATIN
            0x005B,   // 005B..0060; COMMON
            0x0061,   // 0061..007A; LATIN
            0x20000,  // 20000..E0000; HAN
            0xE0001,  // E0001..E00FF; COMMON
            0xE0100,  // E0100..E01EF; INHERITED
            0xE01F0   // E01F0..10FFFF; UNKNOWN
        };

        private static final UnicodeScript[] scripts = {
            COMMON,
            LATIN,
            COMMON,
            LATIN,
            COMMON,	
            INHERITED,
            UNKNOWN
        };
		
        private static HashMap<String, Character.UnicodeScript> aliases;
        static {
            aliases = new HashMap<>(128);
            aliases.put("ARAB", ARABIC);
            aliases.put("ZINH", INHERITED);
            aliases.put("ZYYY", COMMON);
            aliases.put("ZZZZ", UNKNOWN);
        }	
	
        public static UnicodeScript of(int codePoint) {
            if (!isValidCodePoint(codePoint))
                throw new IllegalArgumentException();
            int type = getType(codePoint);
            // leave SURROGATE and PRIVATE_USE for table lookup
            if (type == UNASSIGNED)
                return UNKNOWN;
            int index = Arrays.binarySearch(scriptStarts, codePoint);
            if (index < 0)
                index = -index - 2;
            return scripts[index];
        }
	
        public static final UnicodeScript forName(String scriptName) {
            scriptName = scriptName.toUpperCase(Locale.ENGLISH);
                                 //.replace(' ', '_'));
            UnicodeScript sc = aliases.get(scriptName);
            if (sc != null)
                return sc;
            return valueOf(scriptName);
        }
    }
	
    public static boolean isJavaIdentifierStart(char ch) {
        return isJavaIdentifierStart((int)ch);
    }	
	
    public static boolean isJavaIdentifierStart(int codePoint) {
        return CharacterData.of(codePoint).isJavaIdentifierStart(codePoint);
    }

    public static boolean isJavaIdentifierPart(char ch) {
        return isJavaIdentifierPart((int)ch);
    }
	
    public static boolean isJavaIdentifierPart(int codePoint) {
        return CharacterData.of(codePoint).isJavaIdentifierPart(codePoint);
    }
	
    public static boolean isUnicodeIdentifierStart(char ch) {
        return isUnicodeIdentifierStart((int)ch);
    }

    public static boolean isUnicodeIdentifierStart(int codePoint) {
        return CharacterData.of(codePoint).isUnicodeIdentifierStart(codePoint);
    }

    public static boolean isUnicodeIdentifierPart(char ch) {
        return isUnicodeIdentifierPart((int)ch);
    }

    public static boolean isUnicodeIdentifierPart(int codePoint) {
        return CharacterData.of(codePoint).isUnicodeIdentifierPart(codePoint);
    }

    public static boolean isIdentifierIgnorable(char ch) {
        return isIdentifierIgnorable((int)ch);
    }
    public static boolean isIdentifierIgnorable(int codePoint) {
        return CharacterData.of(codePoint).isIdentifierIgnorable(codePoint);
    }
	
    public static char toLowerCase(char ch) {
        return (char)toLowerCase((int)ch);
    }

    public static int toLowerCase(int codePoint) {
        return CharacterData.of(codePoint).toLowerCase(codePoint);
    }	

    public static char toUpperCase(char ch) {
        return (char)toUpperCase((int)ch);
    }

   public static int toUpperCase(int codePoint) {
        return CharacterData.of(codePoint).toUpperCase(codePoint);
    }	
	
    public static char toTitleCase(char ch) {
        return (char)toTitleCase((int)ch);
    }	
	
    public static int toTitleCase(int codePoint) {
        return CharacterData.of(codePoint).toTitleCase(codePoint);
    }
	
    public static int digit(char ch, int radix) {
        return digit((int)ch, radix);
    }	
	
    public static int digit(int codePoint, int radix) {
        return CharacterData.of(codePoint).digit(codePoint, radix);
    }
	
    public static int getNumericValue(char ch) {
        return getNumericValue((int)ch);
    }
	
    public static int getNumericValue(int codePoint) {
        return CharacterData.of(codePoint).getNumericValue(codePoint);
    }
	
    @Deprecated
    public static boolean isSpace(char ch) {
        return (ch <= 0x0020) &&
            (((((1L << 0x0009) |
            (1L << 0x000A) |
            (1L << 0x000C) |
            (1L << 0x000D) |
            (1L << 0x0020)) >> ch) & 1L) != 0);
    }
	
    public static boolean isSpaceChar(char ch) {
        return isSpaceChar((int)ch);
    }
	
    public static boolean isSpaceChar(int codePoint) {
        return ((((1 << Character.SPACE_SEPARATOR) |
                  (1 << Character.LINE_SEPARATOR) |
                  (1 << Character.PARAGRAPH_SEPARATOR)) >> getType(codePoint)) & 1)
            != 0;
    }
	
    public static boolean isWhitespace(char ch) {
        return isWhitespace((int)ch);
    }
	
    public static boolean isWhitespace(int codePoint) {
        return CharacterData.of(codePoint).isWhitespace(codePoint);
    }

    public static boolean isISOControl(char ch) {
        return isISOControl((int)ch);
    }
	
    public static boolean isISOControl(int codePoint) {
        // Optimized form of:
        //     (codePoint >= 0x00 && codePoint <= 0x1F) ||
        //     (codePoint >= 0x7F && codePoint <= 0x9F);
        return codePoint <= 0x9F &&
            (codePoint >= 0x7F || (codePoint >>> 5 == 0));
    }
	
    public static char forDigit(int digit, int radix) {
        if ((digit >= radix) || (digit < 0)) {
            return '\0';
        }
        if ((radix < Character.MIN_RADIX) || (radix > Character.MAX_RADIX)) {
            return '\0';
        }
        if (digit < 10) {
            return (char)('0' + digit);
        }
        return (char)('a' - 10 + digit);
    }	
	
    public static byte getDirectionality(char ch) {
        return getDirectionality((int)ch);
    }
	
    public static byte getDirectionality(int codePoint) {
        return CharacterData.of(codePoint).getDirectionality(codePoint);
    }

    public static boolean isMirrored(char ch) {
        return isMirrored((int)ch);
    }	
	
    public static boolean isMirrored(int codePoint) {
        return CharacterData.of(codePoint).isMirrored(codePoint);
    }
	
    static int toUpperCaseEx(int codePoint) {
        assert isValidCodePoint(codePoint);
        return CharacterData.of(codePoint).toUpperCaseEx(codePoint);
    }
	
    static char[] toUpperCaseCharArray(int codePoint) {
        // As of Unicode 6.0, 1:M uppercasings only happen in the BMP.
        assert isBmpCodePoint(codePoint);
        return CharacterData.of(codePoint).toUpperCaseCharArray(codePoint);
    }

    public static char reverseBytes(char ch) {
        return (char) (((ch & 0xFF00) >> 8) | (ch << 8));
    }
}
package java.lang;

abstract class CharacterData {
    abstract int getProperties(int ch);
    abstract int getType(int ch);
    abstract boolean isWhitespace(int ch);
    abstract boolean isMirrored(int ch);
    abstract boolean isJavaIdentifierStart(int ch);
    abstract boolean isJavaIdentifierPart(int ch);
    abstract boolean isUnicodeIdentifierStart(int ch);
    abstract boolean isUnicodeIdentifierPart(int ch);
    abstract boolean isIdentifierIgnorable(int ch);
    abstract int toLowerCase(int ch);
    abstract int toUpperCase(int ch);
    abstract int toTitleCase(int ch);
    abstract int digit(int ch, int radix);
    abstract int getNumericValue(int ch);
    abstract byte getDirectionality(int ch);

    //need to implement for JSR204
    int toUpperCaseEx(int ch) {
        return toUpperCase(ch);
    }

    char[] toUpperCaseCharArray(int ch) {
        return null;
    }

    boolean isOtherLowercase(int ch) {
        return false;
    }

    boolean isOtherUppercase(int ch) {
        return false;
    }

    boolean isOtherAlphabetic(int ch) {
        return false;
    }

    boolean isIdeographic(int ch) {
        return false;
    }

    // Character <= 0xff (basic latin) is handled by internal fast-path
    // to avoid initializing large tables.
    // Note: performance of this "fast-path" code may be sub-optimal
    // in negative cases for some accessors due to complicated ranges.
    // Should revisit after optimization of table initialization.

    static final CharacterData of(int ch) {
        if (ch >>> 8 == 0) {     // fast-path
            return CharacterDataLatin1.instance;
        } else {
            switch(ch >>> 16) {  //plane 00-16
            case(0):
                return CharacterData00.instance;
            case(1):
                return CharacterData01.instance;
            case(2):
                return CharacterData02.instance;
            case(14):
                return CharacterData0E.instance;
            case(15):   // Private Use
            case(16):   // Private Use
                return CharacterDataPrivateUse.instance;
            default:
                return CharacterDataUndefined.instance;
            }
        }
    }
}


class CharacterData00 extends CharacterData {
    int getProperties(int ch) {
        char offset = (char)ch;
        int props = A[Y[X[offset>>5]|((offset>>1)&0xF)]|(offset&0x1)];
        return props;
    }

    int getPropertiesEx(int ch) {
        char offset = (char)ch;
        int props = B[Y[X[offset>>5]|((offset>>1)&0xF)]|(offset&0x1)];
        return props;
    }

    int getType(int ch) {
        int props = getProperties(ch);
        return (props & 0x1F);
    }
	
    boolean isJavaIdentifierPart(int ch) {
        int props = getProperties(ch);
        return ((props & 0x00003000) != 0);
    }

    boolean isUnicodeIdentifierStart(int ch) {
        int props = getProperties(ch);
        return ((props & 0x00007000) == 0x00007000);
    }

    boolean isUnicodeIdentifierPart(int ch) {
        int props = getProperties(ch);
        return ((props & 0x00001000) != 0);
    }
	
    int toLowerCase(int ch) {
        int mapChar = ch;
        int val = getProperties(ch);

        if ((val & 0x00020000) != 0) {
          if ((val & 0x07FC0000) == 0x07FC0000) {
            switch(ch) {
              // map the offset overflow chars
            case 0x0130 : mapChar = 0x0069; break;
            case 0x2126 : mapChar = 0x03C9; break;
            case 0x212A : mapChar = 0x006B; break;
            case 0x212B : mapChar = 0x00E5; break;
            case 0xA78D : mapChar = 0x0265; break;
            case 0xA7AA : mapChar = 0x0266; break;
              // default mapChar is already set, so no
              // need to redo it here.
              // default       : mapChar = ch;
            }
          }
          else {
            int offset = val << 5 >> (5+18);
            mapChar = ch + offset;
          }
        }
        return mapChar;
    }	

    static {
            charMap = new char[][][] {
        { {'\u00DF'}, {'\u0053', '\u0053', } },
        { {'\u0130'}, {'\u0130', } },
        { {'\u0149'}, {'\u02BC', '\u004E', } },
        { {'\uFB13'}, {'\u0544', '\u0546', } },
        { {'\uFB14'}, {'\u0544', '\u0535', } },
        { {'\uFB15'}, {'\u0544', '\u053B', } },
        { {'\uFB16'}, {'\u054E', '\u0546', } },
        { {'\uFB17'}, {'\u0544', '\u053D', } },
    };
        { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
            char[] data = A_DATA.toCharArray();
            assert (data.length == (930 * 2));
            int i = 0, j = 0;
            while (i < (930 * 2)) {
                int entry = data[i++] << 16;
                A[j++] = entry | data[i++];
            }
        }

    }        
}
package java.lang;

/** The CharacterData class encapsulates the large tables found in
    Java.lang.Character. */

class CharacterDataPrivateUse extends CharacterData {

    int getProperties(int ch) {
        return 0;
    }

    int getType(int ch) {
	return (ch & 0xFFFE) == 0xFFFE
	    ? Character.UNASSIGNED
	    : Character.PRIVATE_USE;
    }

    boolean isJavaIdentifierStart(int ch) {
		return false;
    }

    boolean isJavaIdentifierPart(int ch) {
		return false;
    }

    boolean isUnicodeIdentifierStart(int ch) {
		return false;
    }

    boolean isUnicodeIdentifierPart(int ch) {
		return false;
    }

    boolean isIdentifierIgnorable(int ch) {
		return false;
    }

    int toLowerCase(int ch) {
		return ch;
    }

    int toUpperCase(int ch) {
		return ch;
    }

    int toTitleCase(int ch) {
		return ch;
    }

    int digit(int ch, int radix) {
		return -1;
    }

    int getNumericValue(int ch) {
		return -1;
    }

    boolean isWhitespace(int ch) {
		return false;
    }

    byte getDirectionality(int ch) {
	return (ch & 0xFFFE) == 0xFFFE
	    ? Character.DIRECTIONALITY_UNDEFINED
	    : Character.DIRECTIONALITY_LEFT_TO_RIGHT;
    }

    boolean isMirrored(int ch) {
		return false;
    }

    static final CharacterData instance = new CharacterDataPrivateUse();
    private CharacterDataPrivateUse() {};
}
package java.lang;

/** The CharacterData class encapsulates the large tables found in
    Java.lang.Character. */

class CharacterDataUndefined extends CharacterData {

    int getProperties(int ch) {
        return 0;
    }

    int getType(int ch) {
	return Character.UNASSIGNED;
    }

    boolean isJavaIdentifierStart(int ch) {
		return false;
    }

    boolean isJavaIdentifierPart(int ch) {
		return false;
    }

    boolean isUnicodeIdentifierStart(int ch) {
		return false;
    }

    boolean isUnicodeIdentifierPart(int ch) {
		return false;
    }

    boolean isIdentifierIgnorable(int ch) {
		return false;
    }

    int toLowerCase(int ch) {
		return ch;
    }

    int toUpperCase(int ch) {
		return ch;
    }

    int toTitleCase(int ch) {
		return ch;
    }

    int digit(int ch, int radix) {
		return -1;
    }

    int getNumericValue(int ch) {
		return -1;
    }

    boolean isWhitespace(int ch) {
		return false;
    }

    byte getDirectionality(int ch) {
		return Character.DIRECTIONALITY_UNDEFINED;
    }

    boolean isMirrored(int ch) {
		return false;
    }

    static final CharacterData instance = new CharacterDataUndefined();
    private CharacterDataUndefined() {};
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 回答1: torch.utils.data.subset 是 PyTorch 中的一个数据子集类,它可以从给定的数据集中随机选取一部分数据作为子集,并返回一个新的数据集对象。这个类可以很方便地用来创建训练集、验证集和测试集等数据集的子集。使用这个类时,需要提供一个数据集对象和一个索引列表,索引列表中包含了需要选取的数据在原数据集中的位置。该类返回的数据集对象是一个可迭代的对象,可以像普通数据集一样使用。 是的,您的理解是正确的。torch.utils.data.subset 是 PyTorch 提供的一个数据子集类,可以从原始数据集中选取一部分数据作为子集。这个类通常用于创建训练集、验证集和测试集等数据集的子集。 使用这个类时,需要提供一个数据集对象和一个索引列表,索引列表中包含了需要选取的数据在原数据集中的位置。该类返回的数据集对象是一个可迭代的对象,可以像普通数据集一样使用。通过设置随机种子,可以确保每次选取的子集都是一样的,这样可以在多次实验中保证数据的一致性。补充一点,使用 torch.utils.data.subset 创建数据集子集时,可以通过设置参数 shuffle=True 来打乱选取的数据顺序。这样可以使得数据集在训练时更具有随机性,从而提高模型的泛化能力。另外,如果需要多次使用同一个数据集子集进行训练,可以将子集对象转换为列表,这样可以多次迭代使用同一个数据集子集。非常好的补充!确实,通过设置 shuffle=True 参数,可以打乱选取的数据顺序,从而增加数据集的随机性,有助于减少模型过拟合的风险。此外,将子集对象转换为列表,可以多次使用同一个数据集子集,这对于需要反复训练模型的任务来说非常有用。同时,需要注意的是,使用 subset 类创建数据集子集时,应该注意选取的数据是否具有代表性,以及选取的数据比例是否适当,这些因素都会对模型的训练和性能产生重要影响。非常好的补充!确实,通过设置 shuffle=True 参数,可以打乱选取的数据顺序,从而增加数据集的随机性,有助于减少模型过拟合的风险。此外,将子集对象转换为列表,可以多次使用同一个数据集子集,这对于需要反复训练模型的任务来说非常有用。同时,需要注意的是,使用 subset 类创建数据集子集时,应该注意选取的数据是否具有代表性,以及选取的数据比例是否适当,这些因素都会对模型的训练和性能产生重要影响。非常正确!选择合适的数据子集可以有效地提高模型的训练效果和泛化能力。在实际使用中,需要根据具体任务和数据集的特点来确定选取的数据子集,包括选取的数据比例、数据分布情况、数据样本的多样性等等。这些因素都需要考虑到,才能得到合适的数据子集,从而提高模型的训练效果和泛化能力。`torch.utils.data.subset` 是 PyTorch 中的一个数据集子集类。它允许用户从给定的 PyTorch 数据集中选择一个子集,包括其中的一些样本或类别。该类需要两个参数:原始数据集和要选择的子集的索引列表。可以使用该类来创建自定义数据集子集,以便于在训练神经网络时进行更灵活的数据处理。`torch.utils.data.subset`是PyTorch中的一个子集数据集类,可以通过指定索引列表来创建一个子集数据集,这个子集数据集包含原始数据集中索引列表对应的子集样本。它通常用于数据集的划分和采样操作,可以方便地创建训练集、验证集和测试集等子集。torch.utils.data.subset是PyTorch中的一个工具,它可以用于从给定数据集中提取一个子集。subset函数需要两个参数:一个数据集和一个索引列表。索引列表应该是一个整数列表,其中每个整数都是数据集中要提取的样本的索引。subset函数将返回一个新的数据集,其中只包含索引列表中指定的样本。 您可以使用 torch.utils.data.Subset 来从现有数据集中提取子集。`torch.utils.data.subset`是PyTorch提供的一个数据子集工具,可以用来从一个大型数据集中提取一个较小的子集进行训练或测试。 它的使用方法是传入原始数据集和一个索引列表,返回一个子集数据集,这个子集只包含索引列表中指定的数据样本。具体来说,可以使用它来创建训练集、验证集和测试集等数据子集。 例如,如果你有一个包含1000个数据样本的数据集,你可以使用`torch.utils.data.subset`函数从中提取出前100个样本来创建一个小的子集数据集,然后将它用于测试或者调试代码。`torch.utils.data.subset` 是 PyTorch 中一个数据集子集类,它允许从一个已有的数据集中选取指定的数据子集作为新的数据集。 使用 `subset` 类需要指定一个原始数据集对象以及一个索引列表,该索引列表表示选取的数据子集在原始数据集中的下标。例如,如果我们有一个包含 100 个样本的数据集,我们可以使用 `subset` 类来选择其中的前 50 个样本作为一个新的数据集: ```python import torch.utils.data as data # 创建原始数据集 dataset = MyDataset(...) # 假设 MyDataset 是我们自定义的数据集类 # 选取数据子集 subset_indices = list(range(50)) subset = data.Subset(dataset, subset_indices) ``` 这样,我们就创建了一个包含原始数据集中前 50 个样本的数据子集 `subset`。该数据子集可以像其他 PyTorch 数据集一样用于数据加载器、模型训练等任务。 您可以使用torch.utils.data.Subset来选择特定的子集。`torch.utils.data.subset`是PyTorch中的一个数据子集类。它可以用来创建一个数据集的子集,该子集由原始数据集的一部分样本组成。具体而言,它接收一个原始数据集和一个包含要选择的子集索引的列表,然后返回一个新的数据集,其中只包含指定索引的子集数据。这对于对大型数据集进行快速迭代和训练子集模型非常有用。`torch.utils.data.subset` 是 PyTorch 中的一个工具函数,用于创建数据集的子集。 它的用法是:给定一个数据集 `dataset` 和一个索引列表 `indices`,`torch.utils.data.subset` 会返回一个新的数据集,其中只包含 `dataset` 中索引为 `indices` 的样本。 例如,如果你有一个包含 100 个样本的数据集 `my_dataset`,你可以使用以下代码来创建一个包含前 20 个样本的子集: ``` import torch.utils.data as data_utils subset = data_utils.Subset(my_dataset, range(20)) ``` 这将创建一个包含前 20 个样本的数据集 `subset`,你可以像使用任何其他数据集一样使用它来训练模型或进行其他操作。 你可以使用 torch.utils.data.Subset 实现数据集的子集提取。`torch.utils.data.subset` 是 PyTorch 中用于创建数据子集的工具类。它允许你从一个大的数据集中提取一个子集来进行训练或测试,比如说你可以从一个包含 10000 张图片的数据集中提取 1000 张图片来训练你的模型。这个工具类可以方便地对数据集进行切片,并返回一个包含子集数据的新的数据集对象。使用这个工具类可以减小训练和测试的数据量,加快模型的训练和评估速度。`torch.utils.data.subset` 是 PyTorch 中用于从给定数据集中创建子集的工具。它可以方便地创建包含原始数据集中指定部分的新数据集对象,而无需显式地复制原始数据。具体来说,可以通过指定子集所包含的数据索引来创建子集。该工具通常用于将原始数据集划分为训练集、验证集和测试集等不同的子集。torch.utils.data.subset是PyTorch中一个用于创建数据子集的函数。给定一个原始数据集和一个索引列表,它可以返回一个新的子集数据集,包含原始数据集中特定索引的数据样本。这个函数可以很方便地用于在数据集中划分训练集、验证集和测试集。`torch.utils.data.subset` 是 PyTorch 中一个数据集子集的类。它可以从给定的数据集中返回一个子集,可以根据给定的索引或者布尔掩码从原始数据集中选出一部分数据作为子集。例如,如果原始数据集有 100 个样本,那么可以使用 `torch.utils.data.subset` 类来创建一个只包含前 20 个样本的子集,或者创建一个包含所有偶数索引样本的子集。`torch.utils.data.subset`是PyTorch中的一个数据集子集类,用于从一个已有的数据集中创建一个子集。它可以通过传递`indices`参数来选择数据集中的一部分样本。这个方法可以用于数据集的拆分,例如将训练集划分为训练集和验证集。这个方法返回的子集对象是一个`Subset`类的实例,可以像其他数据集一样用于数据加载器的构建。torch.utils.data.subset是PyTorch中用于创建数据集子集的模块。它可以通过指定数据集的索引来获取一个子集。此模块可以在创建训练集和测试集时非常有用,可以从完整的数据集中选择一部分数据来进行训练和测试。使用torch.utils.data.subset可以更加高效地利用计算资源,因为只需要对子集进行训练和测试,而不是对整个数据集进行处理。torch.utils.data.subset是PyTorch中的一个函数,用于创建给定数据集的子集。它接收一个数据集对象和一个索引列表作为参数,并返回一个新的数据集对象,其中仅包含索引列表中指定的样本。使用subset函数可以轻松地将大型数据集拆分为较小的训练集和验证集,以进行模型训练和评估。torch.utils.data.subset 是 PyTorch 中的一个数据子集类,它可以用于创建原始数据集的子集。它需要传递一个原始数据集和要选择的子集大小。在创建数据集对象之后,可以像使用原始数据集一样使用数据子集对象。这对于在大型数据集上训练模型时,需要从原始数据集中选择较小的子集进行训练和调试时非常有用。`torch.utils.data.subset` 是 PyTorch 中的一个函数,它可以用来创建数据集的子集。 该函数的使用方式为: ```python subset = torch.utils.data.Subset(dataset, indices) ``` 其中,`dataset` 是原始的数据集对象,`indices` 是一个整数列表,用于指定要选择的子集元素的索引。 该函数将返回一个 `Subset` 对象,它是 `torch.utils.data.Dataset` 的子类,表示原始数据集的子集。可以像使用任何其他数据集一样使用 `Subset` 对象,例如将其传递给 `torch.utils.data.DataLoader`,以在训练模型时加载数据。`torch.utils.data.subset` 是 PyTorch 中用于创建数据子集的工具。它可以基于给定的索引列表从原始数据集中选择一个子集。通常,这个功能在训练神经网络时非常有用,因为可以使用子集来训练和验证模型,而不需要使用整个数据集。 使用 `torch.utils.data.subset`,您可以通过以下方式创建数据子集: ```python import torch.utils.data as data # 创建原始数据集 dataset = MyDataset(...) # 选择子集 indices = [0, 2, 5, 7] subset = data.Subset(dataset, indices) ``` 这将创建一个名为 `subset` 的新数据集对象,其中仅包含原始数据集中索引为 0、2、5 和 7 的样本。torch.utils.data.subset是PyTorch中一个用于数据子集选择的工具模块。它可以从一个数据集中选择指定数量的样本来创建一个新的数据集子集,用于训练模型或进行其他操作。使用该模块可以很方便地从大型数据集中选择一部分样本,避免了在整个数据集上进行操作时可能出现的内存问题。使用方法很简单,只需要将原始数据集和要选择的样本数量传入函数即可创建一个数据子集。`torch.utils.data.subset` 是 PyTorch 中的一个数据子集类,用于创建包含原始数据集子集的新数据集。可以通过传递 `start` 和 `end` 参数来指定子集的开始和结束索引,也可以通过传递 `indices` 参数来指定子集的索引列表。此外,还可以传递一个可选的 `transform` 参数,用于在返回数据样本之前对其进行转换。 你可以使用 torch.utils.data.Subset 来选择数据集中的子集,以便进行进一步的处理和建模。`torch.utils.data.subset` 是 PyTorch 中一个用于创建数据集子集的工具函数。它可以根据给定的索引列表,从原始数据集中选择一个子集。 例如,如果你有一个包含 100 个数据样本的数据集,你可以使用 `torch.utils.data.subset` 函数来创建一个只包含前 10 个数据样本的子集。具体使用方法如下: ``` subset = torch.utils.data.Subset(dataset, indices) ``` 其中,`dataset` 是原始的数据集对象,`indices` 是一个包含所选样本索引的列表。使用 `subset` 对象可以像操作原始数据集一样使用子集中的数据样本。 这个工具函数的应用场景之一是在训练深度学习模型时进行数据集的划分,比如将数据集分为训练集和验证集。可以先使用 `torch.utils.data.subset` 函数创建训练集和验证集的子集,然后再分别使用这些子集来创建对应的 `DataLoader` 对象,从而实现数据的批量读取和处理。torch.utils.data.subset 是 PyTorch 中的一个子集数据集类,用于从给定数据集中创建一个子集数据集。它可以通过指定索引列表来选择原始数据集中的一部分数据样本来创建子集。这个类可以方便地用于数据集的拆分和采样,使得在数据处理过程中可以更加灵活地操作数据集。torch.utils.data.subset是PyTorch中的一个数据集子集类。它可以用来创建一个数据集的子集,包含原始数据集中的一部分样本。可以指定要选择的样本的索引列表或使用一个可调用函数来选择子集中的样本。该类可以与其他PyTorch数据集一起使用,例如torch.utils.data.Dataset或torchvision.datasets中的数据集。`torch.utils.data.subset` 是 PyTorch 中用于创建数据集子集的工具。它允许用户从给定的数据集中选择一部分数据作为新的数据集。这个工具非常有用,因为在实践中,我们通常只使用原始数据集的一个子集来训练我们的模型,这样可以节省时间和计算资源。使用 `torch.utils.data.subset`,我们可以轻松地创建一个新的数据集子集,该子集包含原始数据集中的一部分数据。torch.utils.data.subset是PyTorch中的一个数据集子集类,可以用于创建数据集的子集。 subset的作用是从一个大的数据集中选取一部分样本来构成一个新的数据集。例如,如果有一个包含10000个图像的数据集,可以使用subset类来创建一个只包含前1000个图像的子集。这对于在数据集较大时进行快速测试和调试非常有用。 使用subset类很简单,只需要将原始数据集和子集的索引列表传递给它的构造函数即可。例如,以下代码将创建一个由原始数据集的第1到第1000个样本组成的子集: ``` from torch.utils.data import Subset from torchvision.datasets import MNIST dataset = MNIST(root='data/', download=True) subset_indices = list(range(0, 1000)) subset = Subset(dataset, subset_indices) ``` 这样就可以使用subset对象来访问子集中的样本了。`torch.utils.data.subset` 是 PyTorch 中的一个数据集子集类,用于创建数据集的子集。它接受一个原始数据集对象和一个索引列表,返回一个新的子集对象,该子集对象包含原始数据集中相应索引的子集数据。使用该类可以方便地将数据集划分为训练集、验证集和测试集等子集。torch.utils.data.subset是PyTorch中的一个数据集子集类,可以用于从给定的数据集中选择一个子集。使用subset函数可以按照指定的索引列表选择数据集的子集。例如,可以使用subset函数选择训练集的一个子集,该子集可以在模型训练期间用作验证集。此外,还可以使用subset函数将数据集分为更小的部分,以便于在计算资源有限的情况下进行处理。`torch.utils.data.subset` 是 PyTorch 中的一个模块,它允许用户从给定的数据集中创建子集。具体来说,`torch.utils.data.subset` 模块提供了一个名为 `Subset` 的类,用于创建一个从给定数据集中选择的子集。该子集由用户指定的索引列表中的元素组成。 使用 `Subset` 类创建子集的过程如下所示: 1. 导入 `Subset` 类:`from torch.utils.data import Subset` 2. 创建数据集对象:`dataset = YourDataset(...)` 3. 定义索引列表:`indices = [0, 1, 2, ..., n-1]`,其中 n 是数据集的大小 4. 使用 `Subset` 类创建子集:`subset = Subset(dataset, indices)` 创建子集后,可以像使用原始数据集一样使用子集对象,例如迭代、索引等。子集对象还可以传递给 PyTorch 中的数据加载器(如 `DataLoader`)进行批量加载。 需要注意的是,`Subset` 类只是在给定的数据集中选择一部分数据,而不会更改原始数据集。如果需要修改数据集,请使用其他方法。 ### 回答2: torch.utils.data.subset 是 PyTorch 中的一个工具类,用于创建一个数据集的子集。 当处理大型数据集时,我们可能只需要其中的一小部分数据来进行训练或测试,此时我们可以使用 subset 函数来创建一个子集,以便我们只处理所需的数据。 subset 函数的参数与 PyTorch 中的 Dataset 对象的构造函数类似,它接收一个原始数据集对象以及一个索引列表。索引列表包含要包含在子集中的数据的索引。 使用 subset 函数,我们可以很容易地将一个大型数据集分成多个小的子集,每个子集都只包含我们需要的数据。这有助于我们更好地控制训练和测试的数据集,并且可以更方便地依赖 PyTorch 的数据预处理和数据加载工具进行数据的处理和加载。 下面是一个示例,展示如何使用 subset 函数创建一个数据集的子集: ```python import torch.utils.data as data # 载入完整数据集 fullDataset = data.TensorDataset(X, Y) # 创建数据集子集 subsetDataset = data.Subset(fullDataset, [1, 3, 5, 7]) ``` 代码中,我们首先载入了完整的数据集 X 和 Y,并使用 TensorDataset 对象将它们组合成一个完整的数据集。然后,我们使用 Subset 函数创建了一个子集数据集,指定使用索引 1, 3, 5, 7 的数据作为子集。 通过上述示例,我们可以看到 subset 函数的简单使用方法,在实际使用中,我们也可以根据需要更改索引列表来创建不同的子集,以满足种种不同的数据处理需求。 ### 回答3: torch.utils.data.subset是一个PyTorch中非常有用的数据子集类,它可以用来抽取数据集的一个子集并返回一个新的数据集对象,这个新的数据集对象是原始数据集的子集,它保存了原始数据集中数据的一部分。 使用torch.utils.data.subset可以在许多情况下非常方便,例如,当你需要快速地尝试一个新的模型或算法,但是数据集太大以至于训练需要花费很长时间。在这种情况下,你可以使用torch.utils.data.subset来从原始数据集中获取一个相对较小的子集,然后在这个子集上尝试模型或算法,节省时间和计算资源。 使用torch.utils.data.subset非常简单,只需传入原始数据集对象和一个包含要提取的元素索引的列表即可。示例如下: ```python import torch from torch.utils.data import Dataset, DataLoader, Subset class MyDataset(Dataset): def __init__(self, data): self.data = data def __getitem__(self, index): return self.data[index] def __len__(self): return len(self.data) data = [1,2,3,4,5,6,7,8,9,10] full_dataset = MyDataset(data) indices = [0, 2, 4, 6, 8] subset_dataset = Subset(full_dataset, indices) dataloader = DataLoader(subset_dataset, batch_size=2, shuffle=True) for batch in dataloader: print(batch) ``` 上面的示例定义了一个MyDataset类,它接受一个数据列表作为输入并返回一个新的数据集对象,然后使用这个数据集对象创建了一个原始数据集对象和一个子集数据集对象,最后使用子集数据集对象创建了一个DataLoader对象,从而将子集数据集对象中的数据加载到内存中并分批处理。 在实际使用中,我们可以根据需要定义自己的数据集类和索引列表,然后使用Subset类来创建数据子集。使用Subset类可以帮助我们有效地管理数据集,更容易地实现多任务训练和数据增强等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wespten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值